Python 字典中嵌套列表的列表理解

Python 字典中嵌套列表的列表理解,python,list,python-2.7,dictionary,list-comprehension,Python,List,Python 2.7,Dictionary,List Comprehension,我有一个字典,其中每个值都是一个列表,如下所示: dictA = {1:['a','b','c'],2:['d','e']} 不幸的是,我无法改变这种结构来解决我的问题 我想将列表的所有条目收集到一个列表中,如下所示: ['a','b','c','d','e'] 此外,我只想在if块中执行一次。因为我只想做一次,所以我不想将它存储到中间变量中,所以很自然,列表理解是一种方法。但是怎么做呢?我的第一个猜测 [dictA[key] for key in dictA.keys()] 产量 [['

我有一个字典,其中每个值都是一个列表,如下所示:

dictA = {1:['a','b','c'],2:['d','e']}
不幸的是,我无法改变这种结构来解决我的问题

我想将列表的所有条目收集到一个列表中,如下所示:

['a','b','c','d','e']
此外,我只想在if块中执行一次。因为我只想做一次,所以我不想将它存储到中间变量中,所以很自然,列表理解是一种方法。但是怎么做呢?我的第一个猜测

[dictA[key] for key in dictA.keys()]
产量

[['a','b','c'],['d','e']]
这不起作用,因为

'a' in  [['a','b','c'],['d','e']]
产生
False
。我尝试过的其他方法都使用了某种非法语法


我该如何进行这样的理解呢?

也在返回的列表上循环(直接在字典上循环也会给出键):

或者更直接地使用
dictA.itervalues()

列表理解让你嵌套循环;阅读上述循环,就好像它们是按相同顺序嵌套的一样:

for lst in dictA.itervalues():
    for value in lst:
        # append value to the output list
或使用:

后者获取一系列序列,并让您循环它们,就好像它们是一个大列表一样
dictA.itervalues()
为您提供一系列列表,而
chain()
将它们放在一起,以便
list()
迭代并从中构建一个大列表

如果您所做的只是测试所有值之间的成员关系,那么您真正想要的是一种简单的方法来循环所有值,并针对每个值测试您的值,直到找到匹配项。与适当的生成器表达式一起使用,可以实现以下功能:

any('a' in lst for lst in dictA.itervalues())

只要
dictA
中的任何值列出
'a'
,就会返回
True
,并尽早停止循环
.itervalues()

在这种特殊情况下,您可以使用嵌套理解:

[value for key in dictA.keys() for value in dictA[key]]
但一般来说,如果您已经知道如何将某个内容转换为嵌套列表,则可以使用以下方法展平任何嵌套iterable:

这将返回一个迭代器,而不是列表;如果您需要列表,只需显式执行即可:

list(itertools.chain.from_iterable(dictA[key] for key in dictA.keys()))

作为旁注,
for key in dictA.keys()
的作用与
for key in dictA
的作用相同,只是在较旧版本的Python中,创建额外的键列表会浪费时间和内存。如上所述,
dict上的
iter
iterkeys
相同


因此,在上述所有版本中,最好只在dictA中使用

如果您实际上正在检查成员身份(您的
在…
示例中),您可以将其重写为:

if any('a' in val for val in dictA.itervalues()):
    # do something

这就避免了在实际不需要的情况下对列表进行展平处理。

您可以这样做

output\u list=[]

[output_list.extend(x)for x in{1:['a','b','c',2:['d','e']}.values()]


输出列表将是['a'、'b'、'c'、'd'、'e']

简单的代码,只是为了理解这一点可能会有所帮助

ListA=[]
dictA = {1:['a','b','c'],2:['d','e']}
for keys in dictA:
    for values in dictA[keys]:
        ListA.append(values)

@MartijnPieters:就因为他在最初的问题中有这个问题;我正计划添加一个解释,说明为什么不需要它。不要使用列表理解它的副作用。你在这里浪费内存和CPU周期,因为你也在构建一个
None
值列表。一旦找到匹配项,它也会短路(退出)。哎呀,我没看到你也提出这种方法。对不起,我不是故意让自己看起来像小偷的@马丁:不用担心……:)(根据时间戳,我赢了:P)那是因为我上次编辑刚过上一个宽限期-P无论如何,我并不是第一个发表文章的人。:-)当然,一旦我接受你的回答,问题就变得更复杂了。我现在需要从两个单独的字典中的嵌套列表中提取所有名称。我可以使用
zip()
进行此操作吗?因此,您的解决方案将是
any('a'在lst中代表lst在zip中(dictA.itervalues(),dictB.itervalues())
@wnmaw:Use
itertools.chain()
再次:
any('a'在lst中代表lst在chain(dictA.itervalues(),dictB.itervalues())
zip()。
itertools.chain.from_iterable(dictA[key] for key in dictA.keys())
list(itertools.chain.from_iterable(dictA[key] for key in dictA.keys()))
if any('a' in val for val in dictA.itervalues()):
    # do something
ListA=[]
dictA = {1:['a','b','c'],2:['d','e']}
for keys in dictA:
    for values in dictA[keys]:
        ListA.append(values)