获取与字典中的最小值对应的键

tjv*_*jvr 264 python dictionary idioms min minimum

如果我有一个Python字典,我如何获得包含最小值的条目的键?

我在考虑与这个min()功能有关...

鉴于输入:

{320:1, 321:0, 322:3}
Run Code Online (Sandbox Code Playgroud)

它会回来321.

Ale*_*lli 523

最佳:min(d, key=d.get)- 没有理由插入无用的lambda间接层或提取项目或密钥!

  • `min()` 返回 sorted 中第一个值中的值。键指定对值进行排序的方式。`key=d.get` 表示列表将按字典的值排序。 (7认同)
  • 如果两个不同的键具有相同的值会怎么样?它们碰巧都是最小的价值?你怎么能让它回归? (6认同)
  • @SilentGhost:你不会,我不确定我在想什么. (5认同)
  • @KarelBílek这意味着你以"d"的形式传入了一个列表,例如`[11,22,33]`,而不是字典,例如`{1:11,2:22,3:33}`.'d.get'对字典有效,但对列表无效. (4认同)
  • 如果dict值是列表,可以使用这种技术吗,例如:```d = {"a":[10,None],"b":[20,None]}```,其中min由d [键] [0]? (4认同)
  • [在py3doc中获取方法](https://docs.python.org/3/library/stdtypes.html#dict.get) (4认同)
  • 获得最低/最高值很容易,但我们如何获得两个或更多最低/最高值? (3认同)
  • 我很想写下 `min(d.keys(), key=d.get)` 来澄清这将返回给读者的密钥之一;但在 2.x 中,`.keys()` 是浪费的(而 `.iterkeys()` 只会使图片变得混乱)。你怎么认为? (2认同)
  • 这是如何运作的?那是什么类型的min函数,我认为min()仅将单个值或列表作为参数。如何遍历字典中的所有条目? (2认同)
  • 请记住,使用“d.get”您将丢失“d”的输入信息。在较新的 mypy(例如 >0.9.3.1)中,您将收到类型错误。要保留输入信息,请使用“d.__getitem__” (2认同)

Mar*_*off 43

这是一个答案,实际上给出了OP要求的解决方案:

>>> d = {320:1, 321:0, 322:3}
>>> d.items()
[(320, 1), (321, 0), (322, 3)]
>>> # find the minimum by comparing the second element of each tuple
>>> min(d.items(), key=lambda x: x[1]) 
(321, 0)
Run Code Online (Sandbox Code Playgroud)

d.iteritems()但是,对于较大的词典,使用将更有效.

  • 你可以使用`operator.itemgetter(1)`代替lambda. (3认同)
  • 相反,lamda使用d.get (2认同)

jpp*_*jpp 27

对于具有相同最小值的多个键,您可以使用列表理解:

d = {320:1, 321:0, 322:3, 323:0}

minval = min(d.values())
res = [k for k, v in d.items() if v==minval]

[321, 323]
Run Code Online (Sandbox Code Playgroud)

等效的功能版本:

res = list(filter(lambda x: d[x]==minval, d))
Run Code Online (Sandbox Code Playgroud)

  • 您的答案非常有用,其他人可能会同意:请参阅已接受的答案中对此问题的多个评论。但是,我需要回来两次才能找到它:您会考虑对已接受的答案提出修改吗?你的实际上是互补的。 (3认同)

aby*_*byx 10

min(d.items(), key=lambda x: x[1])[0]


raj*_*ajn 7

min(zip(d.values(), d.keys()))[1]
Run Code Online (Sandbox Code Playgroud)

使用zip函数创建包含值和键的元组的迭代器。然后用 min 函数包装它,该函数根据第一个键取最小值。这将返回一个包含(值,键)对的元组。[1]的索引用于获取对应的key。

  • 虽然此代码可以回答问题,但提供有关此代码为何和/或如何回答问题的附加上下文可以提高其长期价值。 (3认同)

Dan*_*ach 6

>>> d = {320:1, 321:0, 322:3}
>>> min(d, key=lambda k: d[k]) 
321
Run Code Online (Sandbox Code Playgroud)

  • 你真的跑了吗? (4认同)

net*_*ink 6

对于您有多个最小键并希望保持简单的情况

def minimums(some_dict):
    positions = [] # output variable
    min_value = float("inf")
    for k, v in some_dict.items():
        if v == min_value:
            positions.append(k)
        if v < min_value:
            min_value = v
            positions = [] # output variable
            positions.append(k)

    return positions

minimums({'a':1, 'b':2, 'c':-1, 'd':0, 'e':-1})

['e', 'c']
Run Code Online (Sandbox Code Playgroud)