我有这本词典:
primes = {2: True, 3: True, 4: False, 5: True, 6: False, 7: True}
我想创建一个只有True对的列表。它看起来像这样:
[2, 3, 5, 7]
所以我尝试这样做:
primelist = [x for x, y in primes if y]
但我收到错误:
TypeError: 'int' object is not iterable
我做错了什么?
答案 0 :(得分:4)
你很亲密!您只需要在字典上调用.items()
method 1 :
primelist = [x for x, y in primes.items() if y]
迭代Python中的字典只会产生其键,而不是某些人可能期望的键和值。要获取这些内容,请调用.items()
以返回一个可重复的键/值对,然后可以将其解压缩到名称x
和y
中。
1 请注意,这个答案与Python 3.x有关。在Python 2.x中,您应该调用.iteritems()
,因为Python 2.x .items()
方法将构建一个不必要的列表。
答案 1 :(得分:3)
>>> 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]
答案 2 :(得分:0)
如果items
为key
value
进行迭代,然后存储True
>>> [k for k,v in primes.items() if v]
[2, 3, 5, 7]