gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 07:56:47 27 4
gpt4 key购买 nike

有没有办法处理以下列表理解:我有 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))

关于python - 使用列表理解将 python 中的 4 个列表相交,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47540270/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com