如何用单行代码从字典列表提取值到多变量(避免重复遍历)
提取字典列表中多键对应值的高效单行实现
给定结构一致的字典列表lst_of_dcts,示例如下:
lst_of_dcts = [ { 'a': 1, 'b': 2, 'c': 3, 'd': 4, }, # 省略更多字典 { 'a': 10, 'b': 11, 'c': 12, 'd': 13, }, { 'a': 14, 'b': 15, 'c': 16, 'd': 17, } ]
当前通过多次列表推导式提取各键对应的数值列表:
as_list = [d['a'] for d in lst_of_dcts] bs_list = [d['b'] for d in lst_of_dcts] cs_list = [d['c'] for d in lst_of_dcts]
这种方式需要多次遍历字典列表,是否有更简洁的单行实现可以避免重复遍历?
方法1:单行实现,仅遍历一次
用zip()配合生成器表达式,一次性取出所有目标键的值并打包,仅遍历原列表一次:
as_list, bs_list, cs_list = zip(*((d['a'], d['b'], d['c']) for d in lst_of_dcts))
如果需要列表而非元组,可通过map(list, ...)转换:
as_list, bs_list, cs_list = map(list, zip(*((d['a'], d['b'], d['c']) for d in lst_of_dcts)))
方法2:用字典统一收集结果
如果需要保留键与列表的映射关系,用字典推导式也能一次遍历完成:
key_lists = {key: [d[key] for d in lst_of_dcts] for key in ['a', 'b', 'c']}
之后直接通过key_lists['a']、key_lists['b']即可获取对应列表。
方法3:大规模数据用pandas
处理大规模数据时,pandas的DataFrame转换更高效,且仅遍历一次原列表:
import pandas as pd df = pd.DataFrame(lst_of_dcts) as_list, bs_list, cs_list = df['a'].tolist(), df['b'].tolist(), df['c'].tolist()
内容的提问来源于stack exchange,提问作者Ian
相关产品推荐
相关产品推荐

