如何在Python 3.6.4中按列表首元素为键合并多列表?
针对你的列表合并需求的几种Python解决方案
嘿,针对你这个用Python3.6.4合并相同键子列表的需求,我整理了几个实用的方法,刚好适配你说的“相同键最多对应2个子列表”的场景:
方法1:用字典收集(最直观,适合你的限定场景)
字典是处理这种键值分组问题的利器,逻辑简单易懂,而且Python3.6.4里的字典已经是插入有序的(虽然官方在3.7才正式标准化,但CPython的3.6实现已经支持),所以最终结果的顺序会和原列表里键首次出现的顺序一致:
original_list = [[1, 100], [1, 250], [2, 340], [2, 5200]] result_dict = {} for item in original_list: key = item[0] val = item[1] if key in result_dict: # 已经有对应键的列表,直接追加值 result_dict[key].append(val) else: # 第一次遇到该键,初始化列表(先放键本身) result_dict[key] = [key, val] # 把字典的值转成列表就是最终结果 merged_list = list(result_dict.values()) print(merged_list) # 输出: [[1, 100, 250], [2, 340, 5200]]
方法2:用itertools.groupby(通用型,支持更多子列表的情况)
如果以后你的需求扩展,相同键可能对应更多子列表,itertools.groupby会更通用。不过要注意,groupby要求输入列表是按键排序的,你的原列表已经符合这个条件,直接用就行:
from itertools import groupby original_list = [[1, 100], [1, 250], [2, 340], [2, 5200]] merged_list = [] # 按子列表的第一个元素作为分组键 for key, group in groupby(original_list, key=lambda x: x[0]): # 把键和组内所有子列表的第二个元素合并成新列表 merged_item = [key] + [sub_item[1] for sub_item in group] merged_list.append(merged_item) print(merged_list) # 输出: [[1, 100, 250], [2, 340, 5200]]
要是原列表没排序,先加一行original_list.sort(key=lambda x: x[0])就行。
方法3:简洁版字典写法(一行循环搞定)
如果你喜欢更紧凑的代码,用dict.setdefault可以简化逻辑:
original_list = [[1, 100], [1, 250], [2, 340], [2, 5200]] result_dict = {} for k, v in original_list: # 不存在键就初始化[ k ],存在就直接追加v result_dict.setdefault(k, [k]).append(v) merged_list = list(result_dict.values()) print(merged_list)
内容的提问来源于stack exchange,提问作者koddr
相关产品推荐
相关产品推荐

