奇怪的行为:用字典理解列表

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'] 未定义。