这取决于您想要输出的内容。首先,您需要根据“范围” 1过滤您的列表
gen = (x for x in lists if x[0] > 10000)
if
条件可以任意复杂(在有效语法范围内)。例如:
gen = (x for x in lists if 5000 < x[0] < 10000)
完全没问题。
现在,如果您只想要子列表中的第二个元素:
min(x[1] for x in gen)
当然,你可以内联整个事情:
min(x[1] for x in lists if x[0] > 10000)
如果你想要整个子列表:
from operator import itemgetter
min(gen,key=itemgetter(1))
例子:
>>> 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]
不幸的是,这些只会给你第一个符合条件的子列表。要获得所有这些:
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)]
如果您确定将有少于匹配项,则可以使用andN
更有效地执行此操作。在您不知道匹配数上限的一般情况下,我认为这种解决方案更好(与 O(NlogN) 的排序相比,它是 O(N))。heapq
itertools.takewhile
1注意“生成器表达式”在用完之前只能迭代一次