Python的方式来交叉并同时添加列表元素

我有3个列表,a,b和c

每个列表都包含3个数字的元组.

这是一个示例输入:

a = [(1,2,4),(1,7,8),(1,5,4),(3,6,7)]
b = [(1,2,5),(1,9,3),(1,0,3),(3,6,8)]
c = [(2,6,3),(2,4,9),(2,8,5),(1,2,7)]

我正在寻找一种方法来生成一个列表,如果每个元组的两个第一项是等于的,则获取这3个列表的元素,并添加第三个元素.

在我给出的数据中,只有一组元组,其中第一个值等于:(1,2,4),(1,2,5)和(1,2,7).

如果我添加他们的第三个值我有4 5 7 = 16,那么对于那些数据,我最后应该有[(1,2,16)].

每个列表中的两个第一个值是唯一的,[(1,2,7),(1,2,15)]将不存在.

问题是没有找到只有两个第一个值相等的元组,它很容易用列表理解来完成.但我仍然坚持寻找一种同时添加第三个值的pythonistic方法.

我可以这样做:

elem_list = []
for elem in a:
    b_elem = [i for i in b if i[:-1] == elem[:-1]]
    c_elem = [i for i in c if i[:-1] == elem[:-1]]
    if len(b_elem) != 0 and len(c_elem) != 0:
        elem_list.append((elem[0],elem[1], elem[2]+b_elem[0][2]+c_elem[0][2]))        

这给了我想要的输出,但它真的很长,这就是为什么我确定这是一种没有麻烦的Python方式,我只是想不出来.

最佳答案 这是一种方法:

from itertools import product, starmap

def solve(*tups):
    key = tups[0][:2]
    if all(x[:2] == key for x in tups):
        return key + (sum(x[2] for x in tups), )

for p in product(a, b, c):
    out = solve(*p)
    if out:
        print out
        #(1, 2, 16)

或使用上述功能的单线程:

print filter(None, starmap(solve, product(a, b, c)))
#[(1, 2, 16)]
点赞