Python 按键分组的两个元组列表中的和值

Python 按键分组的两个元组列表中的和值,python,python-2.7,Python,Python 2.7,我有两个元组列表,我想按每个键(键,值)对总数进行分组 请注意钥匙 a = [(1713, 1L), (745, 1L), (142, 1L)] b = [(1298, 1L), (620, 1L), (142, 1L)] a_b = [(1713, 1L), (745, 1L), (1298, 1L), (620, 1L), (142, 2L)] 我正在尝试这一点,但当b中的密钥是新的时,显然会失败: d={} for k,v in a: for k1,v1 in b:

我有两个元组列表,我想按每个键(键,值)对总数进行分组

请注意钥匙

a = [(1713, 1L), (745, 1L), (142, 1L)]
b = [(1298, 1L), (620, 1L), (142, 1L)]

a_b = [(1713, 1L), (745, 1L), (1298, 1L), (620, 1L), (142, 2L)]
我正在尝试这一点,但当b中的密钥是新的时,显然会失败:

d={}
for k,v in a:
    for k1,v1 in b:
        if k == k1:
            print k
            d[k] = v+v1
        else:
            d[k] = v
print d #{1713: 1L, 142: 2L, 745: 1L}

您可以通过反向迭代
a
b
的组合列表来使用
collections.OrderedDict
,因为后者的复制键在合并逻辑中优先,之后您可以通过再次反转dict项列表来获得所需的元组列表:

from collections import OrderedDict
d = OrderedDict()
for k, v in reversed(a + b):
    d[k] = d.get(k, 0) + v
a_b = d.items()[::-1]
a_b
变成:

[(1713, 1L), (745, 1L), (1298, 1L), (620, 1L), (142, 2L)]
编辑:由于您现在在评论中提到输出的顺序无关紧要,因此您可以使用常规的dict,就像您在问题中所做的那样。这里的关键是遍历
a
b
的组合列表,并使用
dict.get
方法将键的初始值默认为
0

d = {}
for k, v in a + b:
    d[k] = d.get(k, 0) + v
a_b = d.items()

您可以通过反向迭代
a
b
的组合列表来使用
collections.OrderedDict
,因为后者的复制键在合并逻辑中优先,之后您可以通过再次反转dict项列表来获得所需的元组列表:

from collections import OrderedDict
d = OrderedDict()
for k, v in reversed(a + b):
    d[k] = d.get(k, 0) + v
a_b = d.items()[::-1]
a_b
变成:

[(1713, 1L), (745, 1L), (1298, 1L), (620, 1L), (142, 2L)]
编辑:由于您现在在评论中提到输出的顺序无关紧要,因此您可以使用常规的dict,就像您在问题中所做的那样。这里的关键是遍历
a
b
的组合列表,并使用
dict.get
方法将键的初始值默认为
0

d = {}
for k, v in a + b:
    d[k] = d.get(k, 0) + v
a_b = d.items()
非常适合这种情况。基本上,它是一本知道如何加起来的字典

from collections import Counter

a = [(1713, 1L), (745, 1L), (142, 1L)]
b = [(1298, 1L), (620, 1L), (142, 1L)]

a_b = Counter(dict(a)) + Counter(dict(b))
print([(k, v) for k, v in a_b.items()])
你会得到这样的输出

[(1713, 1L), (1298, 1L), (620, 1L), (142, 2L), (745, 1L)]
当然,如果需要进一步处理,不需要将结果返回元组列表。

非常适合这种情况。基本上,它是一本知道如何加起来的字典

from collections import Counter

a = [(1713, 1L), (745, 1L), (142, 1L)]
b = [(1298, 1L), (620, 1L), (142, 1L)]

a_b = Counter(dict(a)) + Counter(dict(b))
print([(k, v) for k, v in a_b.items()])
from collections import defaultdict as ddt
from itertools import chain

new_dic = ddt(long)
for k,v in chain(a,b):
    new_dic[k] += v
a_b = new_dic.items()
你会得到这样的输出

[(1713, 1L), (1298, 1L), (620, 1L), (142, 2L), (745, 1L)]

当然,如果需要进一步处理,您不需要将结果返回到元组列表。

没有导入的解决方案:

from collections import defaultdict as ddt
from itertools import chain

new_dic = ddt(long)
for k,v in chain(a,b):
    new_dic[k] += v
a_b = new_dic.items()
counter = {key : 0 for key, _ in a + b}
for key, val in a + b:
    counter[key] += val
a_b = [(key, val) for key, val in counter.items()]

没有导入
的解决方案

counter = {key : 0 for key, _ in a + b}
for key, val in a + b:
    counter[key] += val
a_b = [(key, val) for key, val in counter.items()]

1L
应该是字符串吗<代码>“1L”?如果是这样的话,我们还不清楚
“1L”+“1L”=“2L”
@kevinkayaks这是一个长整数它是一个从很久以前就被弃用的语言版本中产生的人工制品。如果这是python3,我会很想推荐类似
列表({**dict(a),**dict(b)}.items())
(我建议切换)哦,谢谢你的教训。我从来没有用python2编码过。
1L
应该是字符串吗<代码>“1L”?如果是这样的话,我们还不清楚
“1L”+“1L”=“2L”
@kevinkayaks这是一个长整数它是一个从很久以前就被弃用的语言版本中产生的人工制品。如果这是python3,我会很想推荐类似
列表({**dict(a),**dict(b)}.items())
(我建议切换)哦,谢谢你的教训。我从来没有用python2编码过。我不确定我是否理解正确,但在这种特殊情况下,合并的顺序是不相关的,因为幸存元组的位置是相关的。如果列表没有先反转,我们会得到
[(1713,1L),(745,1L),(142,2L),(1298,1L),(620,1L)]
,因为如果按原始方向迭代,键
142
首先出现在第三个位置。我的意思是142位置不相关。第三个或最后一个位置在这里并不重要。我不确定我是否理解正确,但在这种特殊情况下,合并的顺序是不相关的,因为幸存元组的位置是相关的。如果列表没有先反转,我们会得到
[(1713,1L),(745,1L),(142,2L),(1298,1L),(620,1L)]
,因为如果按原始方向迭代,键
142
首先出现在第三个位置。我的意思是142位置不相关。第三个或最后一个位置在这里并不重要。