至少列表清单

Pau*_*aul 8 python list min

我有一个像这样的列表列表:

[[10564, 15], [10564, 13], [10589, 18], [10637, 39], [10662, 38], [10712, 50], [10737, 15], [10762, 14], [10787, 9], [10812, 12], [10837, 45], [3, 17], [7, 21], [46, 26], [48, 12], [49, 24], [64, 14], [66,
 17], [976, 27], [981, 22], [982, 22], [983, 17], [985, 13], [517, 9], [521, 15], [525, 11], [526, 13], [528, 14], [698, 14], [788, 24], [792, 19]]
Run Code Online (Sandbox Code Playgroud)

我试图找到每个列表中第二个元素的最低值(所以比较15到13到18等不比较10564和15),但也将它分成范围,所以我可以说,最低的第二个元素[1]在每个列表中,仅当元素[0]超过10000时...我该怎么做?我试过它,只能比较同一列表中的元素,这不是我想要的.在我提到的情况下,我会返回[10787,9],但如果有超过10000的另一个值9,我也想返回.

mgi*_*son 12

这取决于您想要输出的内容.首先,您需要根据"范围"过滤您的列表1

gen = (x for x in lists if x[0] > 10000)
Run Code Online (Sandbox Code Playgroud)

if条件可以是你想要的(在有效的语法)一样复杂.例如:

gen = (x for x in lists if 5000 < x[0] < 10000)
Run Code Online (Sandbox Code Playgroud)

完全没问题.


现在,如果您只想要子列表中的第二个元素:

min(x[1] for x in gen)
Run Code Online (Sandbox Code Playgroud)

当然,你可以内联整个事情:

min(x[1] for x in lists if x[0] > 10000)
Run Code Online (Sandbox Code Playgroud)

如果你想要整个子列表:

from operator import itemgetter
min(gen,key=itemgetter(1))
Run Code Online (Sandbox Code Playgroud)

例:

>>> lists = [[10564, 15], [10564, 13], [10589, 18], [10637, 39], [10662, 38], [10712, 50], [10737, 15], [10762, 14], [10787, 9], [10812, 12], [10837, 45], [3, 17], [7, 21], [46, 26], [48, 12], [49, 24], [64, 14], [66,17], [976, 27], [981, 22], [982, 22], [983, 17], [985, 13], [517, 9], [521, 15], [525, 11], [526, 13], [528, 14], [698, 14], [788, 24], [792, 19]]
>>> gen = (x for x in lists if x[0] > 10000)
>>> min(x[1] for x in gen)
9
>>> gen = (x for x in lists if x[0] > 10000)
>>> from operator import itemgetter
>>> min(gen,key=itemgetter(1))
[10787, 9]
Run Code Online (Sandbox Code Playgroud)

不幸的是,这些仅为您提供符合条件的第一个子列表.要获得所有这些:

target = min(x[1] for x in lists if x[0] > 10000)
matches = [x for x in lists if (x[1] == target) and (x[0] > 10000)]
Run Code Online (Sandbox Code Playgroud)

如果你肯定知道会有少于N匹配,你可以用heapq和更有效地做到这一点itertools.takewhile.在你不知道匹配数量上限的一般情况下,我认为这个解决方案更好(与O(NlogN)的排序相比,它是O(N)).


1请注意,"生成器表达式"只能在耗尽之前迭代一次

  • "但是如果有另外一个超过10000的值,那么我也希望将其归还." - 这个案子怎么样? (3认同)

ndp*_*dpu 5

>>> l=[[10564, 15], [10564, 13], [10589, 18], [10637, 39]]
>>> min(x[1] for x in l if x[0] > 10000)
13
>>>
Run Code Online (Sandbox Code Playgroud)

更新您的评论(您可以使用 lambda 作为 min 函数的键,在大型列表上使用 itemgetter 更快一点):

>>> min((x for x in l if x[0] > 10000), key=lambda k:k[1])
[10564, 13]
Run Code Online (Sandbox Code Playgroud)


Nol*_*lty 5

这是一种非常简单的方法,只需找到最小值,然后根据该值构建列表。

>>> a = [[10564, 15], [10564, 13], [10589, 18], [10637, 39], [10662, 38], [10712, 50], [10737, 15], [10762, 14], [10787, 9], [10812, 12], [10837, 45], [3, 17], [7, 21], [46, 26], [48, 12], [49, 24], [64, 14], [66,
...  17], [976, 27], [981, 22], [982, 22], [983, 17], [985, 13], [517, 9], [521, 15], [525, 11], [526, 13], [528, 14], [698, 14], [788, 24], [792, 19]]
>>> a_min = min(i[1] for i in a)
>>> [i[0] for i in a if i[1] == a_min and i[0] > 10000] + [a_min]
[10787, 9]
Run Code Online (Sandbox Code Playgroud)

代码正确显示多个值:

>>> a += [[10391, 9]] #add another pair with a first value > 10000
>>> [i[0] for i in a if i[1] == a_min and i[0] > 10000] + [a_min]
[10787, 10391, 9]
Run Code Online (Sandbox Code Playgroud)