Python字典:如何获取所有具有特定值的键

27

是否有可能从字典中获取所有值大于某个阈值的键?

一个字典可能看起来像这样:

mydict = {(0,1,2): "16", (2,3,4): "19"}

例如,阈值可以是 17。

2个回答

55
当然可以。我们可以简单地写成:
[k for k,v in mydict.items() if float(v) >= 17]

如果你使用的是 ,就像 @NoticeMeSenpai 所说的那样,最好使用:

[k for k,v in mydict.iteritems() if float(v) >= 17]

这是一个列表推导式。我们遍历字典mydict中的键值对。然后,我们将值v转换为float(v)并检查该浮点数是否大于或等于17。如果是这种情况,我们将键k添加到列表中。
对于您给定的mydict,生成如下结果:
>>> [k for k,v in mydict.items() if float(v) >= 17]
[(2, 3, 4)]

因此,这里包含满足条件的单个键的列表:(2,3,4)


1

在这里可以使用filter()函数。

list(filter(lambda k: float(mydict[k]) >= 17, mydict))

另一种更加复杂的方法是创建布尔选择器,并压缩类似于pandas/numpy中布尔索引的方式。

# using built-in methods
from itertools import compress, repeat
import operator
list(compress(mydict, map(operator.ge, map(float, mydict.values()), repeat(17))))
# or using a lambda
list(compress(mydict, map(lambda x: float(x) >= 17, mydict.values())))

说到pandas/numpy,如果你需要重复地通过值来筛选键,那么pandas Series或numpy数组是一种有用的数据类型,可以将数据存储在其中,以便以向量化的方式更高效地进行此类过滤。
使用pandas Series:
import pandas as pd
my_srs = pd.Series(mydict).astype(int)
my_srs.index[my_srs >= 17].tolist()

使用numpy数组(需要创建两个数组,一个用于键,另一个用于值,并使用值数组来过滤键数组):
import numpy as np
keys = np.array(list(mydict.keys()), dtype=object)
values = np.array(list(mydict.values()), dtype=float)
keys[values >= 17].tolist()

使用numpy结构化数组:

import numpy as np
arr = np.array(list(mydict.items()), dtype=[('keys', object), ('values', int)])
arr['keys'][arr['values'] >= 17]

请注意,此处使用的 filterlambda 被认为是不符合 Python 风格的,并且 Guido 本人曾考虑在 Python 3 中将其“削减”(https://www.artima.com/weblogs/viewpost.jsp?thread=98196)。但我仍然欣赏这个答案提供的多样性 :) - mirekphd

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