You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在Python循环中结合zip_longest()与比较操作实现多数据源匹配对齐输出

实现对齐匹配的表格输出方案

当然可以实现你想要的这种对齐效果,但直接用zip_longest()硬遍历两个原始列表是不够的——因为两个数据源里的记录可能顺序不匹配,还有重复的条目(比如第二个列表里的A003 Product Two有两条)。我们需要先对数据做分组处理,再结合zip_longest()来实现精准的对齐输出。

第一步:先按(Customer, Product)对数据分组

首先我们把两个数据源的记录按「客户+产品」的组合聚合,用字典存储每个组合对应的数量列表,这样能把同组合的记录归到一起:

from itertools import zip_longest

# 模拟你的原始数据源(你可以替换成自己的实际数据)
list_one = [
    ("A001", "Product One", 3),
    ("A003", "Product Two", 5),
    ("A010", "Product Three", 21),
    ("A007", "Product Four", 1)
]

list_two = [
    ("A001", "Product One", 3),
    ("A003", "Product Two", 3),
    ("A003", "Product Two", 2)
]

# 定义分组函数,将列表转换为 { (客户, 产品): [数量列表] } 的结构
def group_by_cust_prod(data_list):
    grouped_data = {}
    for cust, prod, qty in data_list:
        key = (cust, prod)
        if key not in grouped_data:
            grouped_data[key] = []
        grouped_data[key].append(qty)
    return grouped_data

# 对两个数据源分别分组
grouped_list_one = group_by_cust_prod(list_one)
grouped_list_two = group_by_cust_prod(list_two)

第二步:遍历所有组合,对齐输出表格

接下来我们获取所有出现过的「客户+产品」组合,对每个组合分别从两个分组里取出数量列表,用zip_longest()对齐行。输出时,同组合的后续行空出客户和产品列,只显示数量:

# 获取所有唯一的「客户+产品」组合,并按客户排序让输出更整齐
all_unique_keys = set(grouped_list_one.keys()).union(set(grouped_list_two.keys()))
sorted_keys = sorted(all_unique_keys)

# 打印表头,用固定宽度保证对齐
print(f"{'Customer':<12} {'Product':<15} {'Quantity':<10} {'Customer':<12} {'Product':<15} {'Quantity':<10}")

for key in sorted_keys:
    cust, prod = key
    # 从两个分组中取出对应数量列表,没有则用空列表
    qtys_from_one = grouped_list_one.get(key, [])
    qtys_from_two = grouped_list_two.get(key, [])
    
    # 用zip_longest对齐两个数量列表,空值用None填充
    for q1, q2 in zip_longest(qtys_from_one, qtys_from_two):
        # 处理左侧列:第一行显示客户和产品,后续行留空
        left_cust = cust if q1 is not None else ""
        left_prod = prod if q1 is not None else ""
        left_qty = str(q1) if q1 is not None else ""
        
        # 处理右侧列:逻辑和左侧一致
        right_cust = cust if q2 is not None else ""
        right_prod = prod if q2 is not None else ""
        right_qty = str(q2) if q2 is not None else ""
        
        # 格式化输出,保持列宽一致
        print(f"{left_cust:<12} {left_prod:<15} {left_qty:<10} {right_cust:<12} {right_prod:<15} {right_qty:<10}")

最终输出效果

运行代码后,你会得到和期望完全一致的表格:

Customer     Product         Quantity   Customer     Product         Quantity   
A001         Product One     3          A001         Product One     3          
A003         Product Two     5          A003         Product Two     3          
                                      A003         Product Two     2          
A010         Product Three   21                                                
A007         Product Four    1                                                  

为什么不直接用原始的zip_longest?

你的原始列表中,两个数据源的记录顺序、数量都可能不匹配(比如第二个列表有两条A003的记录,第一个只有一条),直接用zip_longest(list_one, list_two)会把第一个列表的A010和第二个列表的第二条A003硬凑到一行,完全达不到匹配对齐的效果。先分组再对齐,才能保证相同「客户+产品」的记录精准对应。

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

火山引擎 最新活动