如何用两个列表创建键对应多个值的字典?
问题与解决方法
需求说明
现有两个列表,需要将List1的元素作为字典的键,List2中对应位置的元素作为值,相同键的元素合并为列表。
原始列表(注:Python中字符串元素需加引号,以下为修正后的可运行版本):
List2 = ["Orange", "Onions", "Cherries", "Steak", "Chicken", "Apples", "Rice", "Grapes"] List1 = ["Fruits", "Vegetable", "Fruits", "Meats", "Meats", "Fruits", "Grains"]
期望输出字典:
result_dict = { "Fruits": ["Orange", "Cherries", "Apples", "Grapes"], "Vegetable": ["Onions"], "Meats": ["Steak", "Chicken"], "Grains": ["Rice"] }
原代码问题分析
你尝试的代码存在以下问题:
- 变量名大小写不匹配:循环中用了
list1,但定义的是List1 if e == set(e)逻辑错误:这行代码判断字符串是否等于自身转成的集合,无实际分组意义- 嵌套循环遍历整个List2会覆盖元素,且每次循环重新创建字典
d,最终仅保留最后一次循环结果
原代码:
List2 = [Orange, Onions, Cherries, Steak, Chicken, Apples, Rice, Grapes] List1 = [Fruits, Vegetable, Fruits, Meats, Meats, Fruits, Grains] for e, f in zip (list1, list2): if e == set(e): for f in list2: d = {e:f}
正确实现方法
方法1:普通字典循环
List2 = ["Orange", "Onions", "Cherries", "Steak", "Chicken", "Apples", "Rice", "Grapes"] List1 = ["Fruits", "Vegetable", "Fruits", "Meats", "Meats", "Fruits", "Grains"] result_dict = {} for key, value in zip(List1, List2): if key in result_dict: result_dict[key].append(value) else: result_dict[key] = [value] print(result_dict)
方法2:使用collections.defaultdict(更简洁)
from collections import defaultdict List2 = ["Orange", "Onions", "Cherries", "Steak", "Chicken", "Apples", "Rice", "Grapes"] List1 = ["Fruits", "Vegetable", "Fruits", "Meats", "Meats", "Fruits", "Grains"] result_dict = defaultdict(list) for key, value in zip(List1, List2): result_dict[key].append(value) # 转为普通字典(可选操作) result_dict = dict(result_dict) print(result_dict)
两种方法执行后均可得到符合需求的分组字典。
内容的提问来源于stack exchange,提问作者thoughtcrime
相关产品推荐
相关产品推荐

