如何添加元组的特定元素

时间:2016-06-08 04:50:27

标签: python list tuples

我有:

([(5,2),(7,2)],[(5,1),(7,3),(11,1)])

我需要添加具有相同第一个元素的第二个元素。

输出:[(5,3),(7,5),(11,1)]

2 个答案:

答案 0 :(得分:1)

这是collections.Counter ...

的一个很好的用例
from collections import Counter
tup = ([(5,2),(7,2)], [(5,1),(7,3),(11,1)])
counts = sum((Counter(dict(sublist)) for sublist in tup), Counter())
result = list(counts.items()) 
print(result)

这里的一个缺点是你将失去输入的顺序。它们出现按键排序,因此您只需对项目进行排序:

result = sorted(counts.items())

Counter是一个字典,其目的是保持"计数"的箱子。计数设计巧妙,您可以简单地将它们加在一起(这会增加计数" bin-wise" - 如果两个计数器中没有箱子,则缺少箱子的值假设是0)。因此,这就解释了为什么我们可以在一堆计数器上使用sum来获取具有所需值的字典。不幸的是,对于这个解决方案,Counter不能通过使用迭代来实例化,它产生像正常映射一样的2项序列......,

Counter([(1, 2), (3, 4)])

会使用密钥Counter(1, 2)创建(3, 4) - 两个值都是1.如果使用映射创建它,它会按预期工作:

Counter(dict([(1, 2), (3, 4)]))

使用密钥Counter1(以及值32)创建4

答案 1 :(得分:1)

试试这段代码:(蛮力,可能是..)

dt = {}
tp = ([(5,2),(7,2)],[(5,1),(7,3),(11,1)])
for ls in tp:
  for t in ls:
    dt[t[0]] = dt[t[0]] + t[1] if t[0] in dt else t[1]
print dt.items()

这里采用的方法是循环遍历元组列表并将元组的数据存储为字典,其中元组t[0]中的第一个元素是key和第二个元素元素t[1]value 在迭代时,每次在元组的第一个元素中找到相同的键时,使用元组的第二个元素添加该值。最后,我们会根据需要提供包含所有dtkey对的字典value。将此字典转换为元组列表dt.items(),我们有输出。