使用字典的列表理解
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 对的可迭代对象,然后可以将其解压缩为名称 x
和 y
.
1请注意,此答案是关于 Python 3.x 的。在 Python 2.x 中,您应该改为调用 .iteritems()
,因为 Python 2.x .items()
方法将构建一个不必要的列表。
您可以遍历 items
,如果 value
是 True
,则存储 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]
我有这本字典:
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 对的可迭代对象,然后可以将其解压缩为名称 x
和 y
.
1请注意,此答案是关于 Python 3.x 的。在 Python 2.x 中,您应该改为调用 .iteritems()
,因为 Python 2.x .items()
方法将构建一个不必要的列表。
您可以遍历 items
,如果 value
是 True
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]