我有一个像这样的列表列表:
[[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请注意,"生成器表达式"只能在耗尽之前迭代一次
>>> 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)
这是一种非常简单的方法,只需找到最小值,然后根据该值构建列表。
>>> 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)