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

如何对两个Python集合的差异输出按对应条目分组排序?

问题描述

我有两个Python集合a和b,当前用以下代码获取并打印两个集合的差异,但输出条目顺序混乱,无法将两个集合中对应差异的条目(如同一用户的不同记录)相邻显示。我需要实现如「期望输出」所示的格式:将对应差异的条目成对排列,每组之间用空行分隔。

原代码

from collections import defaultdict

a = {
    'Jane Lee|248 Another St.|Boston|US|02130|4535353535.35353535353',
    'Jim Smth|123 Any Street|Boston|US|02134',
    'Name|Address|City|Country|Pinode'
}

b = {
    'Jane Lee|248 Another St.|Boston|US|02130|4535353535.3535355353',
    'Jim Smith|123 Any Stret|Boston|US|02134',
    'Name|Address|Cty|Country|Pincode'
}

res_dict = defaultdict(list)
diff = ([('ua.csv,' + i) if i in a else ('pr.csv,' + i) if i in b else ''
         for i in list(a ^ b)])

if diff == []:
    print('Great!!! There are no differences')
else:
    print('\n'.join(diff))

实际输出

ua.csv,Name|Address|City|Country|Pinode
ua.csv,Jane Lee|248 Another St.|Boston|US|02130|4535353535.35353535353
pr.csv,Name|Address|Cty|Country|Pincode
pr.csv,Jim Smith|123 Any Stret|Boston|US|02134
pr.csv,Jane Lee|248 Another St.|Boston|US|02130|4535353535.3535355353
ua.csv,Jim Smth|123 Any Street|Boston|US|02134

期望输出

ua.csv,Name|Address|City|Country|Pinode
pr.csv,Name|Address|Cty|Country|Pincode

ua.csv,Jane Lee|248 Another St.|Boston|US|02130|4535353535.35353535353
pr.csv,Jane Lee|248 Another St.|Boston|US|02130|4535353535.3535355353

pr.csv,Jim Smith|123 Any Stret|Boston|US|02134
ua.csv,Jim Smth|123 Any Street|Boston|US|02134

解决方案

核心思路是通过**记录的唯一标识(每条记录按|分割后的第一个字段)**对差异条目分组,确保同属一个主体的差异条目被归为一组,再按组输出。

修改后的代码

from collections import defaultdict

a = {
    'Jane Lee|248 Another St.|Boston|US|02130|4535353535.35353535353',
    'Jim Smth|123 Any Street|Boston|US|02134',
    'Name|Address|City|Country|Pinode'
}

b = {
    'Jane Lee|248 Another St.|Boston|US|02130|4535353535.3535355353',
    'Jim Smith|123 Any Stret|Boston|US|02134',
    'Name|Address|Cty|Country|Pincode'
}

# 用每条记录的第一个字段作为键,分组存储差异条目
diff_groups = defaultdict(list)
for item in a ^ b:
    # 提取分组键(按|分割后的第一个元素)
    group_key = item.split('|')[0]
    # 根据条目所属集合添加前缀
    if item in a:
        diff_groups[group_key].append(f'ua.csv,{item}')
    else:
        diff_groups[group_key].append(f'pr.csv,{item}')

if not diff_groups:
    print('Great!!! There are no differences')
else:
    # 拼接输出内容,组之间用空行分隔
    output_lines = []
    for group_entries in diff_groups.values():
        output_lines.extend(group_entries)
        output_lines.append('')  # 组间添加空行
    # 移除最后一行多余的空行
    print('\n'.join(output_lines[:-1]))

代码说明

  1. 分组逻辑:利用split('|')[0]提取每条记录的第一个字段(如Jane Lee、Name)作为分组键,保证同一主体的差异条目被分到同一组。
  2. 分组存储:使用defaultdict自动创建列表,存储每个分组对应的两条差异条目(分别来自集合a和b)。
  3. 格式化输出:遍历所有分组,将组内条目加入输出列表,组之间插入空行,最后移除末尾多余的空行,得到符合要求的输出格式。

最终输出

运行修改后的代码,将得到与「期望输出」完全一致的结果。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 03:15:57