在列表中添加元组元素

时间:2016-06-09 09:31:45

标签: python list tuples

l1=[(2,1),(3,2),(4,5)]
l2=[(2,3),(3,6),(11,3)]

我需要:

result=[(2,4),(3,8),(4,5),(11,3)]

使用for循环我能够添加具有相同第一个元素的元组。

>>> result = []
l1 = [(2, 1), (3, 2), (4, 5)]
l2 = [(2, 3), (3, 6), (11, 3)]
for x, y in l1:
    for p, q in l2:
        if x == p:
            result.append((x, (y + q)))

>>> result
[(2, 4), (3, 8)]

如何进一步添加(4,5),(11,3)

4 个答案:

答案 0 :(得分:2)

使用l1形成的dict并迭代l2可以轻松完成,请参阅下面的工作代码段:

l1=[(2,1),(3,2),(4,5)]
l2=[(2,3),(3,6),(11,3)]
result = dict(l1)

for y in l2:
    result[y[0]] = result.get(y[0],0) + y[1]

result = result.items()
print result #[(11, 3), (2, 4), (3, 8), (4, 5)]

或者只是通过迭代l1l2的连接来构建结果:

l1=[(2,1),(3,2),(4,5)]
l2=[(2,3),(3,6),(11,3)]
result = {}
for item in l1 + l2:
    result[item[0]] = result.get(item[0],0) + item[1]

祝你好运!

答案 1 :(得分:2)

如果我理解你的目标,就没有必要对Manager的所有元素都使用l2的元素。如果列表的大小不均匀,只需使用zip(或 izip_longest 来使用每个列表中的元组,然后使用l1第一项和总和第一项匹配并且append两个元组如果不匹配:

extend

输入后,返回所需的输出:

for tup1, tup2 in zip(l1, l2):
    if tup1[0] == tup2[0]:
        result.append((tup1[0], (tup1[1] + tup2[1])))
    else:
        result.extend([tup1, tup2])

答案 2 :(得分:2)

实现同一目标的方法很多......我喜欢它!

这是我的解决方案。

l1=[(2,1),(3,2),(4,5)]
l2=[(2,3),(3,6),(11,3)]

d1 = dict(l1)
d2 = dict(l2)
result = []

for k in d1:
    if k in d2:
        result.append((k,d1[k]+d2[k]))
    else:
        result.append((k,d1[k]))

for k in d2:
    if k not in d1:
        result.append((k,d2[k]))


>>>print result
[(2, 4), (3, 8), (4, 5), (11, 3)]

答案 3 :(得分:1)

使用字典来跟踪已使用的密钥似乎很自然。您可以使用defaultdict

来缩小代码大小
import collections

l1=[(2,1),(3,2),(4,5)]
l2=[(2,3),(3,6),(11,3)]

d = collections.defaultdict(int)
for x,y in l1 + l2:
    d[x] += y
print sorted(d.items())