我有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
我想将b1
,b2
和b3
加在一起,无论元组的第一个元素中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
的总和(需要)。
答案 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
后者在代码中。