从字典嵌套列表生成单一导演列表:列表推导式问题排查
列表推导式生成扁平列表的问题与修正
问题背景
现有以年份为键、导演列表为值的字典:
nominated = {1931: ['Norman Taurog', 'Wesley Ruggles', 'Clarence Brown', 'Lewis Milestone', 'Josef Von Sternberg'], 1932: ['Frank Borzage', 'King Vidor', 'Josef Von Sternberg'], 1933: ['Frank Lloyd', 'Frank Capra', 'George Cukor']}
需求是生成包含所有导演的单一扁平列表:
all_directors = ['Norman Taurog', 'Wesley Ruggles', 'Clarence Brown', 'Lewis Milestone', 'Josef Von Sternberg','Frank Borzage', 'King Vidor', 'Josef Von Sternberg','Frank Lloyd', 'Frank Capra', 'George Cukor']
错误的列表推导式及结果
尝试使用如下列表推导式:
all_directors = [[director for director in nominated_directors] for year, nominated_directors in nominated.items()] print(all_directors)
得到的是嵌套列表,不符合需求:
[['Norman Taurog', 'Wesley Ruggles', 'Clarence Brown', 'Lewis Milestone', 'Josef Von Sternberg'], ['Frank Borzage', 'King Vidor', 'Josef Von Sternberg'], ['Frank Lloyd', 'Frank Capra', 'George Cukor']]
而使用嵌套for循环能得到正确结果:
all_directors = [] for year, directors in nominated.items(): for director in directors: all_directors.append(director) print(all_directors)
错误原因分析
你写的列表推导式是嵌套列表推导式,外层循环每次生成一个完整的子列表,最终把这些子列表收集成一个大列表,自然得到嵌套结构。这相当于把嵌套循环的逻辑层级写错了:原嵌套循环是在外层循环里逐个追加元素,而错误的推导式是在外层循环里生成完整子列表再收集。
修正后的列表推导式
要生成扁平列表,需要调整列表推导式的层级为单层扁平推导,对应嵌套循环的顺序,把内层循环放在前面:
all_directors = [director for year, nominated_directors in nominated.items() for director in nominated_directors] print(all_directors)
运行后就能得到符合需求的单一扁平列表,和嵌套for循环的结果完全一致。
逻辑对应关系
这个修正后的推导式和嵌套循环的逻辑一一对应:
- 外层循环:
for year, nominated_directors in nominated.items() - 内层循环:
for director in nominated_directors - 最终收集的是每次内层循环的
director元素,而非子列表
内容的提问来源于stack exchange,提问作者Hana
相关产品推荐
相关产品推荐

