如何从含重复键的两个列表创建值为列表的字典?
如何将重复键的列表转换为值为列表的字典?
给定两个列表:
subject_id = [10030, 10030, 10250, 10510] student_id = [55000, 55804, 55804, 55000]
使用dict(zip(subject_id, student_id))会因为重复键被覆盖,只能保留最后一个对应值:
{10030: 55804, 10250: 55804, 10510: 55000}
要实现重复键对应的值为列表,将所有匹配的student_id存入列表,得到如下结果:
{10030: [55000, 55804], 10250: [55804], 10510: [55000]}
可以用以下几种方法实现:
方法1:手动循环判断
最直观的实现方式,手动检查键是否存在,不存在则创建列表,存在则追加元素:
subject_id = [10030, 10030, 10250, 10510] student_id = [55000, 55804, 55804, 55000] my_dict = {} for subj, stud in zip(subject_id, student_id): if subj in my_dict: my_dict[subj].append(stud) else: my_dict[subj] = [stud] print(my_dict)
方法2:使用collections.defaultdict
借助collections模块的defaultdict,可以自动为不存在的键创建默认值(这里是空列表),简化代码:
from collections import defaultdict subject_id = [10030, 10030, 10250, 10510] student_id = [55000, 55804, 55804, 55000] my_dict = defaultdict(list) for subj, stud in zip(subject_id, student_id): my_dict[subj].append(stud) # 可选:转换为普通字典 my_dict = dict(my_dict) print(my_dict)
方法3:使用dict.setdefault
利用字典内置的setdefault方法,该方法会返回键对应的值,若键不存在则先设置默认值(空列表),再返回:
subject_id = [10030, 10030, 10250, 10510] student_id = [55000, 55804, 55804, 55000] my_dict = {} for subj, stud in zip(subject_id, student_id): my_dict.setdefault(subj, []).append(stud) print(my_dict)
内容的提问来源于stack exchange,提问作者Fernando Araiza
相关产品推荐
相关产品推荐

