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:Useitertools.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)