我有一个元组列表。每个元组的元素0是一个数字值。我想在元素0中找到所有具有最小值的元组。例如:
l = [(2, 'a'), (1, 'b'), (3, 'c'), (1, 'd'), (4, 'e'), (1, 'f')]
l.sort()
i = 1
while i < len(l):
if l[i - 1][0] != l[i][0]:
break
i += 1
print(l[:i])
会给我我想要的东西
[(1, 'b'), (1, 'd'), (1, 'f')]
我的问题是(可能是三个不同的答案):代码高尔夫/最快/最Pythonic的方式是什么?
答案 0 :(得分:3)
>>> [v for v in l if v[0] == min(l, key = lambda k: k[0])[0]]
[(1, 'b'), (1, 'd'), (1, 'f')]
让我们看看:
min(l, key = lambda k: k[0])
-将为我们提供具有最小整数值的元组。
添加[0]
将为我们提供最小整数的值,然后使用list comprehension
在列表上运行,我们将获得所有具有最小值的元组。
PS
最好在使用列表推导之前计算最小值,这样您就不必每次都计算它了(但我认为它不是Pythonic的):)
>>> min_value = min(l, key = lambda k: k[0])[0]
>>> [v for v in l if v[0] == min_value]
[(1, 'b'), (1, 'd'), (1, 'f')]
答案 1 :(得分:3)
这是使用min
的解决方案。时间复杂度为O( n ),并且使用O(1)辅助空间(即,不包括输出列表的空间)。
from operator import itemgetter
min_key, _ = min(lst, key=itemgetter(0))
result = [ (k, v) for k, v in lst if k == min_key ]
答案 2 :(得分:0)
您可以避免在列表上使用一遍来对所有内容进行排序:
l = [(2, 'a'), (1, 'b'), (3, 'c'), (1, 'd'), (4, 'e'), (1, 'f')]
v = l[0]
r = [v]
mk = v[0]
for v in l[1:]:
key, val = v
if key < mk:
mk = key
r = [v]
elif key == mk:
r.append(v)
print(r)
不确定它是否更聪明-但您可以使用以下方法跳过一些比较:
l = [(2, 'a'), (1, 'b'), (3, 'c'), (1, 'd'), (4, 'e'), (1, 'f')]
l.sort()
i = 1
k = l[0][0]
for e in l[1:]: # 1 less element iterated
if e[0] != k: # cache the lookup value
break
i += 1
print(l[:i])