5

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

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

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

4

5 回答 5

10

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

[value for key in dictA for value in dictA[key]]

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

[value for lst in dictA.itervalues() for value in lst]

列表推导让你可以嵌套循环;阅读上面的循环,就好像它们以相同的顺序嵌套一样:

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

或使用itertools.chain.from_iterable()

from itertools import chain

list(chain.from_iterable(dictA.itervalues()))

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

如果您所做的只是测试所有值之间的成员资格,那么您真正想要的是一种简单的方法来遍历所有值,并针对每个值测试您的值,直到找到匹配项。该any()函数与合适的生成器表达式一起执行以下操作:

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

这将在列出任何值后立即返回,True并提前停止循环。dictA'a'.itervalues()

于 2013-11-04T20:46:45.290 回答
2

如果您实际上是在检查成员资格(您的a in...示例),则可以将其重写为:

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

如果实际上不需要的话,这可以避免展平列表。

于 2013-11-04T20:51:05.277 回答
0

在这种特殊情况下,您可以只使用嵌套推导:

[value for key in dictA.keys() for value in dictA[key]]

但一般来说,如果您已经知道如何将某些内容转换为嵌套列表,则可以使用以下方法展平任何嵌套的可迭代对象chain.from_iterable

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

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

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

附带说明一下,除了在旧版本的 Python 中,它会浪费时间和内存来制作额外的键列表,与for key in dictA.keys()做相同的事情。for key in dictA正如文档所说,iteron adictiterkeys.

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

于 2013-11-04T20:47:54.003 回答
0

在简单的代码中只是为了理解这可能会有所帮助

ListA=[]
dictA = {1:['a','b','c'],2:['d','e']}
for keys in dictA:
    for values in dictA[keys]:
        ListA.append(values)
于 2013-11-05T11:22:15.600 回答
-1

你可以做一些像..

output_list = []

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

output_list 将是 ['a', 'b', 'c', 'd', 'e']

于 2013-11-04T20:54:36.620 回答