Skip to main content
 首页 » 编程设计

python之使用列表理解将 python 中的 4 个列表相交

2025年05月04日13Free-Thinker

有没有办法处理以下列表理解: 我有 4 个列表:t1、x1(t1)、t2、x2(t2)。 t1 和 t2 的长度不同,x1 和 x2 的长度也不同。我想将 t1 和 t2 相交的 x1 和 x2 的值相加,对于那些 t2 和 t1 不相交的值,只需将它们的值附加到两个新列表 x 和 t 中即可。

t1 = [0.0, 20.0, 40.0, 50.0, 60.0, 80.0] 
x1 = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0] 
t2 = [40.0, 50.0, 80.0] 
x2 = [7.0, 8.0, 9.0] 

所以我的新 t 和 x 是:

t = [0.0, 20.0, 40.0, 50.0, 60.0, 80.0] 
x = [1.0, 2.0, 10.0, 12.0, 5.0, 15.0] 

这是带有双循环的代码。虽然到目前为止它只是加起来。仍然需要为不相交的 t1、t2、x1 和 x2 附加这些值:

x = []  
t = [] 
for y in range(len(t1)): 
    for z in range(len(t2)): 
        if t1[y] == t2[z]: 
           t.append(t1[y]) 
           x.append(x1[y] + x2[z]) 

请您参考如下方法:

您可以使用 heapq.merge 将时间“压缩”在一起,然后使用 itertools.groupby 找到巧合。这些都是线性复杂度运算,因此应该可以很好地扩展:

import heapq, itertools, operator 
t, x = zip(*((k, sum(map(operator.itemgetter(1), v))) for k, v in itertools.groupby(heapq.merge(zip(t1, x1), zip(t2, x2)), operator.itemgetter(0)))) 
t 
# (0.0, 20.0, 40.0, 50.0, 60.0, 80.0) 
x 
# (1.0, 2.0, 10.0, 12.0, 5.0, 15.0) 

一步一步:

merged = heapq.merge(zip(t1, x1), zip(t2, x2)) 
# make list for printing 
merged = list(merged) 
merged 
# [(0.0, 1.0), (20.0, 2.0), (40.0, 3.0), (40.0, 7.0), (50.0, 4.0), (50.0, 8.0), (60.0, 5.0), (80.0, 6.0), (80.0, 9.0)] 
grouped = itertools.groupby(merged, operator.itemgetter(0)) 
# make printable 
grouped = [(k, list(v)) for k, v in grouped] 
grouped 
# [(0.0, [(0.0, 1.0)]), (20.0, [(20.0, 2.0)]), (40.0, [(40.0, 3.0), (40.0, 7.0)]), (50.0, [(50.0, 4.0), (50.0, 8.0)]), (60.0, [(60.0, 5.0)]), (80.0, [(80.0, 6.0), (80.0, 9.0)])] 
t, x = zip(*((k, sum(map(operator.itemgetter(1), v))) for k, v in grouped))