如何过滤 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 以仅选择大于值的键? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

过滤字典以仅包含某些键?

如何使数组过滤器与异步函数端一起使用? [复制]

在Python中过滤字典的最佳方法[重复]

NHibernate 3 LINQ:如何过滤 IQueryable 以仅选择 T 类及其子类的对象?

如何获取 HashMap 中特定值的键? [复制]

如何执行条件“executeFetchRequest”以仅获取特定属性为零的实体? [复制]