wnn*_*maw 4 python dictionary list-comprehension list python-2.7
我有一个字典,其中每个值都是一个列表,如下所示:
dictA = {1:['a','b','c'],2:['d','e']}
Run Code Online (Sandbox Code Playgroud)
不幸的是,我无法改变这种结构来解决我的问题
我想将列表的所有条目收集到一个列表中,如下所示:
['a','b','c','d','e']
Run Code Online (Sandbox Code Playgroud)
另外,我想在if-block中只执行一次.由于我只想做一次,我不想将它存储到一个中间变量,所以很自然地,列表理解是要走的路.但是怎么样?我的第一个猜测,
[dictA[key] for key in dictA.keys()]
Run Code Online (Sandbox Code Playgroud)
产量,
[['a','b','c'],['d','e']]
Run Code Online (Sandbox Code Playgroud)
哪个不起作用,因为
'a' in [['a','b','c'],['d','e']]
Run Code Online (Sandbox Code Playgroud)
收益率False.我尝试的其他所有内容都使用了某种非法语法.
我怎么能理解这种理解?
循环遍历返回的列表(直接在字典上循环也为您提供键):
[value for key in dictA for value in dictA[key]]
Run Code Online (Sandbox Code Playgroud)
或更直接使用dictA.itervalues():
[value for lst in dictA.itervalues() for value in lst]
Run Code Online (Sandbox Code Playgroud)
列表推导让你嵌套循环; 阅读上面的循环,好像它们以相同的顺序嵌套:
for lst in dictA.itervalues():
for value in lst:
# append value to the output list
Run Code Online (Sandbox Code Playgroud)
或使用itertools.chain.from_iterable():
from itertools import chain
list(chain.from_iterable(dictA.itervalues()))
Run Code Online (Sandbox Code Playgroud)
后者采用一系列序列,让你循环遍历它们,好像它们是一个大的列表.dictA.itervalues()为您提供一系列列表,chain()并将它们放在一起以便 list()迭代并构建一个大列表.
如果你所做的只是测试所有值中的成员资格,那么你真正想要的是一种简单的方法来遍历所有的值,并测试你的值,直到你找到匹配.该any()函数与合适的生成器表达式一起实现:
any('a' in lst for lst in dictA.itervalues())
Run Code Online (Sandbox Code Playgroud)
这将返回True只要在任何价值dictA已经'a'上市,并停止遍历.itervalues()月初.
| 归档时间: |
|
| 查看次数: |
1260 次 |
| 最近记录: |