列表对列表中嵌套的列表的理解

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.我尝试的其他所有内容都使用了某种非法语法.

我怎么能理解这种理解?

Mar*_*ers 8

循环遍历返回的列表(直接在字典上循环为您提供键):

[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()月初.