如何将嵌套列表合并为以其首元素为键的字典?
当然可以轻松实现!这里有几种不同的方法,你可以根据自己的需求选择:
方法1:基础循环遍历(直观易懂)
这个方法适合刚接触Python的朋友,逻辑清晰,一步步来:
l = [['A', '1'], ['A', '2'], ['B', '1'], ['C', '1'], ['C', '2']] d = {} for key, value in l: if key not in d: d[key] = [] d[key].append(value) print(d) # 输出: {'A': ['1', '2'], 'B': ['1'], 'C': ['1', '2']}
思路很简单:先初始化一个空字典,然后逐个处理每个子列表。如果键不在字典里,就先创建一个空列表作为它的值;如果键已经存在,就把对应的value追加到列表里。
方法2:使用collections.defaultdict(更简洁)
Python的collections模块里的defaultdict能帮我们省去判断键是否存在的步骤,它会自动为不存在的键创建默认值(这里我们指定默认值为列表):
from collections import defaultdict l = [['A', '1'], ['A', '2'], ['B', '1'], ['C', '1'], ['C', '2']] d = defaultdict(list) for key, value in l: d[key].append(value) # 如果需要转成普通字典(可选操作) d = dict(d) print(d) # 输出: {'A': ['1', '2'], 'B': ['1'], 'C': ['1', '2']}
这种写法更简洁,代码量更少,是日常开发中比较常用的方案。
方法3:使用itertools.groupby(适合已排序的场景)
如果你的列表已经按照第一个元素(键)排好序,或者你不介意先排序的话,可以用itertools.groupby来实现:
from itertools import groupby l = [['A', '1'], ['A', '2'], ['B', '1'], ['C', '1'], ['C', '2']] # 注意:groupby要求连续相同的键才能分组,所以必须先按键排序 sorted_l = sorted(l, key=lambda x: x[0]) d = {key: [item[1] for item in group] for key, group in groupby(sorted_l, key=lambda x: x[0])} print(d) # 输出: {'A': ['1', '2'], 'B': ['1'], 'C': ['1', '2']}
这种方法用了字典推导式,看起来很优雅,但一定要记得先排序——如果原列表里的键不连续,会被分成多个独立的组,导致结果不符合预期。
总结
- 追求逻辑直观、不想引入额外模块?选方法1;
- 想写更简洁的代码?选方法2;
- 列表已经排序,或者需要排序后的结果?选方法3。
内容的提问来源于stack exchange,提问作者Kacper Reicher
相关产品推荐
相关产品推荐

