是否有一种方法来理解列表:我有4个列表: t1,x1(t1),t2,x2(t2)。t1和t2的长度不同,x1和x2的长度也不同。我想将x1和x2的值相加,其中t1和t2相交,对于那些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])发布于 2017-11-28 22:03:19
您可以使用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))发布于 2017-11-28 20:58:54
我有4个列表: t1,x1(t1),t2,x2(t2)。t1和t2的长度不同,x1和x2的长度也不同。我想将x1和x2的值相加,其中t1和t2相交,对于那些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]首先,为您拥有“键”和“值”对的数据创建字典,而不是试图破坏一个常见的索引:
data1 = dict(zip(t1, x1))
data2 = dict(zip(t2, x2))现在,通过组合它们的键,从这两个键中创建一个字典:
data3 = {key: data1.get(key, 0) + data2.get(key, 0) for key in set(list(data1.keys()) + list(data2.keys()))}这是你的数据。如果您真的需要,那么作为列表:
t = data3.keys()
x = data3.values()发布于 2017-11-28 20:49:48
到目前为止,如果x1和x2的对应t值匹配,则可以对它们的值进行求和:
t2 = [0.0, 20.0, 40.0, 50.0, 60.0, 80.0]
x2 = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0]
t1 = [40.0, 50.0, 80.0]
x1 = [7.0, 8.0, 9.0]
t = [i for i in t1 for j in t2 if i==j]
x = [sum(i) for i in [(x1[i], x2[j]) for i, k in enumerate(t1) for j, l in enumerate(t2) if t1[i]==t2[j]]]
print(t)
print(x)输出:
t = [40.0, 50.0, 80.0]
x = [10.0, 12.0, 15.0]https://stackoverflow.com/questions/47540270
复制相似问题