奇怪的行为:用字典理解列表
Strange behavior: list comprehension with dictionaries
我最近遇到(类似)以下情况。考虑以下词典列表。
dics = [{'a':'a',
'b':[{'a':'a'},
{'a':'b'},
{'a':'c'},
{'a':'d'},
{'a':'e'}]},
{'a':'a',
'b':[{'a':'a'}]}]
我想要一个所有最里面的字典中对应于键 'a' 的值的列表,这些值依次列在键 'b' 下。当然,我们可以用下面的for循环来实现:
result = []
for d1 in dics:
for d2 in d1['b']:
result.append(d2['a'])
但是,我希望使用列表理解来做到这一点。现在,我发现
result = [[d2['a'] for d2 in d1['b']] for d1 in dics]
结果在列表 [['a', 'b', 'c', 'd', 'e'], ['a']]
中,因此有理由(或者我认为)
result = [d2['a'] for d2 in d1['b'] for d1 in dics]
会产生“扁平化”列表 ['a', 'b', 'c', 'd', 'e', 'a']
,这正是我想要的。然而,我实际得到的是列表 ['a', 'a']
。这是怎么回事?
你把双循环的内循环和外循环倒过来了。试试看:
result = [d2['a'] for d1 in dics for d2 in d1['b']]
其实,令人惊讶的是
[d2['a'] for d2 in d1['b'] for d1 in dics]
没有导致 NameError,因为在外循环中 d1['b']
未定义。
我最近遇到(类似)以下情况。考虑以下词典列表。
dics = [{'a':'a',
'b':[{'a':'a'},
{'a':'b'},
{'a':'c'},
{'a':'d'},
{'a':'e'}]},
{'a':'a',
'b':[{'a':'a'}]}]
我想要一个所有最里面的字典中对应于键 'a' 的值的列表,这些值依次列在键 'b' 下。当然,我们可以用下面的for循环来实现:
result = []
for d1 in dics:
for d2 in d1['b']:
result.append(d2['a'])
但是,我希望使用列表理解来做到这一点。现在,我发现
result = [[d2['a'] for d2 in d1['b']] for d1 in dics]
结果在列表 [['a', 'b', 'c', 'd', 'e'], ['a']]
中,因此有理由(或者我认为)
result = [d2['a'] for d2 in d1['b'] for d1 in dics]
会产生“扁平化”列表 ['a', 'b', 'c', 'd', 'e', 'a']
,这正是我想要的。然而,我实际得到的是列表 ['a', 'a']
。这是怎么回事?
你把双循环的内循环和外循环倒过来了。试试看:
result = [d2['a'] for d1 in dics for d2 in d1['b']]
其实,令人惊讶的是
[d2['a'] for d2 in d1['b'] for d1 in dics]
没有导致 NameError,因为在外循环中 d1['b']
未定义。