我有一个列表如下:
[[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]]
我试图找到每个列表中第二个元素的最低值(所以比较15到13到18等不比较10564和15),还要把它分成范围,所以我可以说,最低的第二个元素[1]在每个列表中,仅当元素[0]超过10000时...我该怎么做?我试过它,只能比较同一列表中的元素,这不是我想要的。在我提到的情况下,我会返回[10787,9]但是如果有另外一个值超过10000而且我还想要返回它。
答案 0 :(得分:11)
这取决于您想要输出的内容。首先,您需要根据“范围” 1
过滤列表gen = (x for x in lists if x[0] > 10000)
if
条件可能与您想要的一样复杂(在有效语法中)。 e.g:
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)]
如果您确定不会有N
次匹配,则可以使用heapq
和itertools.takewhile
更有效地完成此操作。在你不知道匹配数量上限的一般情况下,我认为这个解决方案更好(与O(NlogN)的排序相比,它是O(N)。
1 请注意,“生成器表达式”只能在耗尽之前迭代一次
答案 1 :(得分:4)
这是一种非常简单的方法,只需找到最小值,然后根据该值构建列表。
>>> 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]
代码正确显示多个值:
>>> 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]
答案 2 :(得分:2)
>>> l=[[10564, 15], [10564, 13], [10589, 18], [10637, 39]]
>>> min(x[1] for x in l if x[0] > 10000)
13
>>>
更新你的评论(你可以在min函数中使用lambda作为键,在大型列表上使用itemgetter更快一点):
>>> min((x for x in l if x[0] > 10000), key=lambda k:k[1])
[10564, 13]
答案 3 :(得分:2)
如果您需要多个min
,那么您最好过滤适用的元素并对其进行排序......
vals = sorted((el for el in your_list if el[0] >= 10000), key=lambda L: L[1])
# [[10787, 9], [10812, 12], [10564, 13], [10762, 14], [10564, 15], [10737, 15], [10589, 18], [10662, 38], [10637, 39], [10837, 45], [10712, 50]]
然后您可以vals[0]
获取第一个,vals[1]
获取第二个,或使用切片,例如vals[:5]
...
答案 4 :(得分:1)
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]]
print min(map(lambda y: y[1] ,filter(lambda x: x[0]>10000,a)))