查找列表中的所有最小值

时间:2019-12-14 18:10:27

标签: python python-3.x list

我有一个元组列表。每个元组的元素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的方式是什么?

3 个答案:

答案 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])
相关问题