包含重复项的嵌套字典中的求和值

时间:2018-01-04 22:40:47

标签: python sum tuples defaultdict

我有defaultdict(int)个元组(它包含2个内部键),我想将这些内部键的值相加元组的第一个元素。

例如:

dict = defaultdict(lambda: defaultdict(int))

dict[key][elem_one, elem_two] += 1  # defaultdict format

# The keys (elem1, elem2) and their values (ints) under the first outer key:
(a1, b1) = 1
(a2, b2) = 1
(a2, b1) = 7
(a3, b3) = 4
(a3, b1) = 10

我想将b1b2b3加在一起,无论元组的第一个元素中a的值是多少,并且输出一个仅包含b值及其求和值的集合。期望的输出:

{b1 = 18, b2 = 1, b3 = 4}

到目前为止,我所尝试的是:

out_set = {k[1]: v for k, v in dict[key].items()}  # k[1] gives me b

这给了我正确的格式,但错误的数字!它没有总结。我得到类似的东西:

{b1 = 1, b2 = 1, b3 = 1}

所以我尝试按如下方式更改我的代码:

out_set = {k[1]: sum(v) for k, v in dict[key].items()}  # k[1] gives me b

但是我收到以下错误:

TypeError: 'int' object is not iterable

我该如何纠正?

在我的实际代码中,我的defaultdict(int)要大得多。例如,一个键可以包含16个值(elem1, elem2)及其各自的值。我发现的是,当我转换为该集时,它会删除任何重复的elem2(这是所需的),但它似乎采用与{{1}相关联的随机值},而不是重复elem2的总和(需要)。

1 个答案:

答案 0 :(得分:1)

我建议您使用另一个defaultdict并利用整数的默认值为0这一事实,因此,您将能够添加到新声明的(并且不是明确的)初始化)整数因为无论如何它都会隐式初始化为0。这样的事情:

import collections

dct = {
    (1, 1): 1,  # This will be overwritten by (1, 1): 7
    (2, 2): 1,
    (1, 1): 7,
    (3, 3): 4,
    (3, 1): 10
}

aux_dict = collections.defaultdict(int)
for key, val in dct.items():
    aux_dict[key[1]] += val
print(aux_dict) 

将输出:

defaultdict(<type 'int'>, {1: 17, 2: 1, 3: 4})

然而,由于元组(和dicts)如何工作,我发现重要的是坚持你不能有两个相同的键。这意味着......

dct = {
    (1, 1): 1,  # This will be overwritten by (1, 1): 7
    (1, 1): 7,
}
print(dct)

...只会输出{(1, 1): 7}。如果你需要保留重复的密钥...不知何故,这是一个不同的问题:这与求和值无关,而是如何在字典中保留“重复”键。我引用副本,因为你真的不能有两个相同的键。我们需要找出一种不将这些密钥视为重复的方法。

我对上述段落的意思是,您不会收到b1: 18,因为(a1, b1): 1不在要添加的值字典中,因为您有(a1, b1): 7后者在代码中。