You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python中遍历列表生成按键分组的新列表的Pythonic实现

解决Python中按键分组合并列表元素的问题

这问题我之前处理类似需求时也碰到过,用Python实现这种按键分组、合并值的操作,有两种非常Pythonic的方式,给你详细说说:

方法一:使用collections.defaultdict(无需排序,更灵活)

这种方法不需要提前排序原列表,适合原列表键不连续的场景,代码逻辑也很直观:

from collections import defaultdict

object_1 = [(1,"car"), (1,"stuff"), (2,"things"), (2,"more stuff"), (3,"less thing"), (4,"diff_things")]

# 用defaultdict自动初始化每个键对应的空列表
grouped_dict = defaultdict(list)
for key, value in object_1:
    grouped_dict[key].append(value)

# 转换为目标格式:单个值的项保留字符串,多个值的保留列表
result = []
for key, values in grouped_dict.items():
    if len(values) == 1:
        result.append((key, values[0]))
    else:
        result.append((key, values))

print(result)
# 输出:[(1, ['car', 'stuff']), (2, ['things', 'more stuff']), (3, 'less thing'), (4, 'diff_things')]

逻辑说明:

  1. defaultdict(list)会帮我们自动为每个新键创建一个空列表,省去了判断键是否存在的步骤;
  2. 遍历原列表,把每个值按对应键添加到列表中;
  3. 最后遍历分组后的字典,根据值列表的长度决定是保留单个字符串还是列表,完全匹配你要的格式。

方法二:使用itertools.groupby(适合已排序的列表)

如果你的原列表已经是按键排序的(或者可以接受排序操作),groupby是个更简洁的选择,但要注意**groupby只会分组连续的相同键元素**,所以必须先排序:

from itertools import groupby

object_1 = [(1,"car"), (1,"stuff"), (2,"things"), (2,"more stuff"), (3,"less thing"), (4,"diff_things")]

# 先按键排序,确保相同键的元素连续
sorted_items = sorted(object_1, key=lambda x: x[0])

result = []
for key, group in groupby(sorted_items, key=lambda x: x[0]):
    # 提取当前组的所有值
    values = [item[1] for item in group]
    # 根据值的数量决定格式
    result.append((key, values[0] if len(values) == 1 else values))

print(result)
# 输出和上面完全一致

逻辑说明:

  1. 先用sorted把原列表按第一个元素(键)排序;
  2. groupby按键分组,返回每个键对应的迭代器;
  3. 把迭代器转换成值列表,再通过三元表达式判断格式,一行完成格式转换。

如果不介意单个值也用列表统一格式(比如所有项都是(key, [value])),那可以去掉长度判断,直接result.append((key, values)),代码会更简洁。

内容的提问来源于stack exchange,提问作者javier osorio

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:50:51