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