如何返回字典中对应最小值的键列表

8

假设我有一个水果字典:

Fruits = {"apple":8, "banana":3, "lemon":5, "pineapple":2,}

我希望您能将输出转化为

["pineapple"]

因为菠萝的价值最低。或者如果我有这个:

因为菠萝的价值最低。或者如果我有这个:

Colour = {"blue":5, "green":2, "purple":6, "red":2}

输出结果将会是:
["green","red"]

因为绿色和红色都具有最小值。

那么如何在字典中返回最小的值呢?


2
有用的链接 https://dev59.com/4nA75IYBdhLWcg3wdIz7 - shadab.tughlaq
8个回答

16

可以分两步完成:

>>> colour
{'blue': 5, 'purple': 6, 'green': 2, 'red': 2}
>>> min_val = min(colour.itervalues())
>>> [k for k, v in colour.iteritems() if v == min_val]
['green', 'red']
  1. 找到字典值的最小值
  2. 然后回到字典中提取那个值所对应的键...

另外一种方法(需要一些导入,而且如果需要的话可以获取 n 个),但是这段代码仅获取第一个(也就是最小值):

from itertools import groupby
from operator import itemgetter

ordered = sorted(colour.iteritems(), key=itemgetter(1))
bykey = groupby(ordered, key=itemgetter(1))
print map(itemgetter(0), next(bykey)[1])
# ['green', 'red']

如果你有一个字典的列表呢? - Zizzipupp

4

我认为最好的选择是进行两次操作:

min_value = min(dict.values())
result = [key for key, value in dict.iteritems() if value == min_value]

您可以通过显式循环一次性完成操作:
result = []
min_value = None
for key, value in dict.iteritems():
    if min_value is None or value < min_value:
        min_value = value
        result = []
    if value == min_value:
        result.append(key)

但这会变得更慢(除非是在 PyPy 中)


1
对于最有效的解决方案(第二种),另一种不需要检查“None”的方法是设置min_value = float('inf')。在我看来更好。 - jamylak
由于值是数字,因此代码在开头使用 min_value = float("inf") 会更简单。以后无需测试 None。 - Eric O. Lebigot
@EOL:正确。如果所有元素都为+inf,那也可以运行。 - 6502

1

据我所见,它使用类似于以下的不规范lambda函数:

min(Fruits,key=lambda x:Fruits[x])

我猜它只会返回一个值,但还是很不错的。 :)

3
min(fruits, key=fruits.get) 更好:不需要使用 lambda 表达式来增加间接性。 - Eric O. Lebigot
请解释一下这个魔法是如何工作的!它与其他方法(例如'operator'导入)相比如何? - typhon04

1

只是一个选项:

from collections import defaultdict
from operator import itemgetter

Fruits = {"apple":8, "banana":3, "lemon":5, "pineapple":2,}
Colour = {"blue":5, "green":2, "purple":6, "red":2}


def get_res(dVals):
    res = defaultdict(list)
    for k, v in dVals.items():
        res[v].append(k)
    return min(res.items(), key=itemgetter(0))[1]

print get_res(Fruits)
print get_res(Colour)

1
ans =[min(Fruits, key=Fruits.get)]
print(ans)

上述代码在字典中查找对应于最小值的键。它查找字典(Fruits)中函数Fruits.get(key)等于Fruits[key]返回的最低可比值的键。
对于具有最小值的多个键,首先从字典Fruits获取最小值,然后使用for循环从字典中获取相应的键,如下所示。
min_value= min(Fruits.values())
ans= [key for key in Fruits if Fruits[key]==min_value]
print(ans)

0
colors = {"blue":5, "green":2, "purple":6, "red":2}# {"apple":8, "banana":3, "lemon":5, "pineapple":2,}

sorted_items = sorted(colors.items(), key=lambda t: t[1])
print (sorted_items)


min_val = sorted_items[0][1]

for t in sorted_items:
    if t[1] == min_val:
        print(t[0])
    else:
        break




--output:--
[('green', 2), ('red', 2), ('blue', 5), ('purple', 6)]

green
red

0
import itertools
def getmin(dictionary):
    gen = ((j,i) for i,j in dictionary.iteritems())
    items = sorted(gen)
    minimum = items.pop(0)
    rest = itertools.takewhile(lambda item:item[0]==minimum[0],items)
    return [x[1] for x in itertools.chain([minimum],rest)]

这种方法使用施瓦茨变换来利用本地排序(无需键)。它根据字典中键的值对项目进行排序,取最小值,并取所有相同的值。


1
嗯...你为什么认为使用Schwartzian变换是一件好事,当'key'已经被设计成不再需要这样做了呢? - jamylak

-1
minimum = []      # creates empty list for all possible minimum keys
def min(dict):    # defines a function called minimum taking a argument dict
    m= min(dict.values())     # stating minimum value in dict
    for key, values in dict.items():     # iterating through key and values in items of dictionary
        if value == m:        # checking if value is minimum
            minimum.append(key)      # appending minimum values to the empty list created
    return minimum         # returning the list

如果函数本身被称为 min,则该函数无法使用内置的 min。这将导致无限递归。修复方法很简单; 重命名函数(但您还需要移动全局变量,以便在函数内部声明)。 - tripleee

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接