是否有可能从字典中获取所有值大于某个阈值的键?
一个字典可能看起来像这样:
mydict = {(0,1,2): "16", (2,3,4): "19"}
例如,阈值可以是 17。
是否有可能从字典中获取所有值大于某个阈值的键?
一个字典可能看起来像这样:
mydict = {(0,1,2): "16", (2,3,4): "19"}
例如,阈值可以是 17。
[k for k,v in mydict.items() if float(v) >= 17]
如果你使用的是 Python 2.7,就像 @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)
。
在这里可以使用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())))
import pandas as pd
my_srs = pd.Series(mydict).astype(int)
my_srs.index[my_srs >= 17].tolist()
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]
filter
和lambda
被认为是不符合 Python 风格的,并且 Guido 本人曾考虑在 Python 3 中将其“削减”(https://www.artima.com/weblogs/viewpost.jsp?thread=98196)。但我仍然欣赏这个答案提供的多样性 :) - mirekphd