我有:
([(5,2),(7,2)],[(5,1),(7,3),(11,1)])
我需要添加具有相同第一个元素的第二个元素。
输出:[(5,3),(7,5),(11,1)]
答案 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)]))
使用密钥Counter
和1
(以及值3
和2
)创建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
在迭代时,每次在元组的第一个元素中找到相同的键时,使用元组的第二个元素添加该值。最后,我们会根据需要提供包含所有dt
,key
对的字典value
。将此字典转换为元组列表dt.items()
,我们有输出。