首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >python中的相交4列表与列表理解

python中的相交4列表与列表理解
EN

Stack Overflow用户
提问于 2017-11-28 20:22:02
回答 4查看 176关注 0票数 1

是否有一种方法来理解列表:我有4个列表: t1,x1(t1),t2,x2(t2)。t1和t2的长度不同,x1和x2的长度也不同。我想将x1和x2的值相加,其中t1和t2相交,对于那些t2和t1不相交的值,只需将它们的值附加到两个新的列表x和t中。

代码语言:javascript
复制
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是:

代码语言:javascript
复制
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追加这些值:

代码语言:javascript
复制
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])
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2017-11-28 22:03:19

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

代码语言:javascript
复制
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)

一步步地:

代码语言:javascript
复制
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))
票数 2
EN

Stack Overflow用户

发布于 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中。

代码语言:javascript
复制
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]

首先,为您拥有“键”和“值”对的数据创建字典,而不是试图破坏一个常见的索引:

代码语言:javascript
复制
data1 = dict(zip(t1, x1))
data2 = dict(zip(t2, x2))

现在,通过组合它们的键,从这两个键中创建一个字典:

代码语言:javascript
复制
data3 = {key: data1.get(key, 0) + data2.get(key, 0)  for key in set(list(data1.keys()) + list(data2.keys()))}

这是你的数据。如果您真的需要,那么作为列表:

代码语言:javascript
复制
t = data3.keys()
x = data3.values()
票数 2
EN

Stack Overflow用户

发布于 2017-11-28 20:49:48

到目前为止,如果x1和x2的对应t值匹配,则可以对它们的值进行求和:

代码语言:javascript
复制
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)

输出:

代码语言:javascript
复制
t = [40.0, 50.0, 80.0]
x = [10.0, 12.0, 15.0]
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47540270

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档