如何过滤 dict 以仅选择大于值的键? [复制]
Posted
技术标签:
【中文标题】如何过滤 dict 以仅选择大于值的键? [复制]【英文标题】:How to to filter dict to select only keys greater than a value? [duplicate] 【发布时间】:2011-05-10 01:03:00 【问题描述】:我有一个结构如下的字典:
5:"djdj", 6:"8899", 7:"998kdj"
键是 int 类型的,没有排序。
现在我想要所有键为 >= 6 的元素。
有没有简单的方法可以做到这一点?
【问题讨论】:
您想要一个list
,其中所有值在dict
中都有一个大于或等于6 的键吗?还是您想要一个没有低于 6 的键的 dict
?
很遗憾这个问题被关闭了。它明确询问密钥,而所谓的重复项严格处理值。
【参考方案1】:
[v for k,v in mydict.items() if k >= 6]
【讨论】:
合法吗:k,v for k,v in mydict.items() if k >= 6 @Bin Chen:他们在 Python 3 中添加了该语法(使用 : 而不是 , ),但目前还没有。 python.org/dev/peps/pep-0274 这会丢弃密钥。要返回字典,请参阅下面的 ehemient 或 bukzor 的答案。【参考方案2】:“元素”是什么意思?
如果你想要一个dict
的键值对,键值≥6,Python 2.7+ 和 3.x 支持 dict 理解。
k: v for k, v in mydict.items() if k >= 6
你可以在早期版本的 Python 中得到这个
dict( (k, v) for k, v in mydict.items() if k >= 6 ) # Python 2.4+
dict([(k, v) for k, v in mydict.items() if k >= 6]) # Python 2.0+
通过使用表达式生成器或列表推导。
如果你只想要一个键列表,
[ k for k in mydict.keys() if k >= 6 ]
filter( lambda k: k >= 6, mydict.keys() )
同样,如果您只想要一个值列表,
[ v for k, v in mydict.items() if k >= 6 ]
[ mydict[k] for k in mydict.keys() if k >= 6 ]
map( mydict.get, filter( lambda k: k >= 6, mydict.keys() ) )
【讨论】:
您的列表理解中的意思是if
,而不是 where
。
哦。明显地。最近 SQL 太多了……【参考方案3】:
filter
也可以。
In [9]: data = 5:"djdj", 6:"8899", 7:"998kdj"
In [10]: dict(filter(lambda x: x[0] > 5, data.items()))
Out[10]: 6: '8899', 7: '998kdj'
【讨论】:
【参考方案4】:[ mydict[k] for k in filter(lambda x : x > 6, mydict) ]
【讨论】:
糟糕,为什么不用in mydict if k > 6
而不是使用过滤器?【参考方案5】:
立即获取字典:(适用于 python 2 和 3)
dict( (k,v) for k,v in mydict.items() if k >= 6 )
【讨论】:
【参考方案6】:如果您知道最大的键并且没有丢失的键,您也可以直接浏览字典:[mydict[x] for x in range(6, largest_key+1)]
。这将是最有效的方式。
【讨论】:
@bukzor:那么你有很多丢失的键,所以这不适用。另一方面,考虑一个包含 10^9 个条目的字典,其中您希望 x 【参考方案7】:您可以使用列表推导:
mydict = 5:"djdj", 6:"8899", 7:"998kdj"
print [k for k in mydict if k >= 6] # prints "[6, 7]"
print dict([(k, mydict[k]) for k in mydict if k >= 6]) # prints "6:"8899", 7:"998kdj""
【讨论】:
在 Python 3 中,您可以进行字典理解,因此dict([(k, mydict[k]) for k in mydict if k >= 6])
可以变为 k: mydict[k] for k in mydict if k >= 6])
。可能对这种情况没有帮助,但很酷:-)【参考方案8】:
列表理解似乎是您所寻求的,但带有元素列表而不是键:
a = 5:"djdj", 6:"8899", 7:"998kdj"
[a[elem] for elem in a if elem >= 6] #should give you "['8866', '998kd']"
【讨论】:
以上是关于如何过滤 dict 以仅选择大于值的键? [复制]的主要内容,如果未能解决你的问题,请参考以下文章