使用字典的列表理解

List comprehesion using a dictionary

我有这本字典:

 primes = {2: True, 3: True, 4: False, 5: True, 6: False, 7: True} 

而且我想创建一个列表,其中只包含为真的那对。它看起来像这样:

[2, 3, 5, 7]

所以我尝试这样做:

primelist = [x for x, y in primes if y]

但我收到错误消息:

TypeError: 'int' object is not iterable

我做错了什么?

你很接近!你只需要在字典上调用.items() method1

primelist = [x for x, y in primes.items() if y]

遍历 Python 中的字典只会产生它的键,而不是某些人可能期望的键和值。要获得这些,您可以调用 .items() 到 return 一个 key/value 对的可迭代对象,然后可以将其解压缩为名称 xy.


1请注意,此答案是关于 Python 3.x 的。在 Python 2.x 中,您应该改为调用 .iteritems(),因为 Python 2.x .items() 方法将构建一个不必要的列表。

您可以遍历 items,如果 valueTrue

,则存储 key
>>> [k for k,v in primes.items() if v]
[2, 3, 5, 7]
>>> filter(primes.get, primes)
[2, 3, 5, 7]

(那是 Python 2,对于 Python 3 你需要在它周围打一个 list(...)。)

我现在用速度测试它,数字高达一百万。 100 次运行的平均值:

Python 2.7.9:
0.0908 seconds for filter(primes.get, primes)
0.2372 seconds for [n for n, p in primes.items() if p]

Python 3.4.3:
0.1856 seconds for list(filter(primes.get, primes))
0.0953 seconds for [n for n, p in primes.items() if p]


参考文献:filter() list() items()