Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 按键对子部分中的值求和_Python - Fatal编程技术网

Python 按键对子部分中的值求和

Python 按键对子部分中的值求和,python,Python,有类似于口述的: x = { '1': {'a': 1, 'b': 3}, '2': {'a': 2, 'b': 4} } 我想要一个新的键total,其中包含子字典中每个键的总和,如: x['total'] = {'a': 3, 'b': 7} 我试着从中改写答案,但没有成功 有人能解释一下吗?假设x的所有值都是字典,您可以迭代它们的项来编写新字典 from collections import defaultdict x = { '1': {'a': 1, 'b': 3

有类似于口述的:

x  = {
  '1': {'a': 1, 'b': 3},
  '2': {'a': 2, 'b': 4}
}
我想要一个新的键
total
,其中包含子字典中每个键的总和,如:

x['total'] = {'a': 3, 'b': 7}
我试着从中改写答案,但没有成功


有人能解释一下吗?

假设
x
的所有值都是字典,您可以迭代它们的项来编写新字典

from collections import defaultdict

x  = {
  '1': {'a': 1, 'b': 3},
  '2': {'a': 2, 'b': 4}
}

total = defaultdict(int)

for d in x.values():
    for k, v in d.items():
        total[k] += v

print(total)
# defaultdict(<class 'int'>, {'a': 3, 'b': 7})
从集合导入defaultdict
x={
'1':{'a':1,'b':3},
'2':{'a':2'b':4}
}
总计=默认DICT(整数)
对于x.values()中的d:
对于d.项()中的k,v:
总[k]+=v
打印(总计)
#defaultdict(,{'a':3,'b':7})

假设
x
的所有值都是字典,您可以迭代它们的项以组成新字典

from collections import defaultdict

x  = {
  '1': {'a': 1, 'b': 3},
  '2': {'a': 2, 'b': 4}
}

total = defaultdict(int)

for d in x.values():
    for k, v in d.items():
        total[k] += v

print(total)
# defaultdict(<class 'int'>, {'a': 3, 'b': 7})
从集合导入defaultdict
x={
'1':{'a':1,'b':3},
'2':{'a':2'b':4}
}
总计=默认DICT(整数)
对于x.values()中的d:
对于d.项()中的k,v:
总[k]+=v
打印(总计)
#defaultdict(,{'a':3,'b':7})

您可以使用字典理解:

x = {'1': {'a': 1, 'b': 3}, '2': {'a': 2, 'b': 4}}
full_sub_keys = {i for b in map(dict.keys, x.values()) for i in b}
x['total'] = {i:sum(b.get(i, 0) for b in x.values()) for i in full_sub_keys}
输出:

{'1': {'a': 1, 'b': 3}, '2': {'a': 2, 'b': 4}, 'total': {'b': 7, 'a': 3}}

您可以使用字典理解:

x = {'1': {'a': 1, 'b': 3}, '2': {'a': 2, 'b': 4}}
full_sub_keys = {i for b in map(dict.keys, x.values()) for i in b}
x['total'] = {i:sum(b.get(i, 0) for b in x.values()) for i in full_sub_keys}
输出:

{'1': {'a': 1, 'b': 3}, '2': {'a': 2, 'b': 4}, 'total': {'b': 7, 'a': 3}}

Patrick answer的一种变体,使用
集合.计数器
,只使用
更新
,因为子目录已经采用了正确的格式:

from collections import Counter

x  = {
  '1': {'a': 1, 'b': 3},
  '2': {'a': 2, 'b': 4}
}

total = Counter()

for d in x.values():
    total.update(d)

print(total)
结果:

Counter({'b': 7, 'a': 3})

update
Counter
的工作方式不同,它不会覆盖键,而是增加当前值,这是与
defaultdict(int)
的细微区别之一)

Patrick answer的变体,使用
collections.Counter
update
,因为子目录的格式已经正确:

from collections import Counter

x  = {
  '1': {'a': 1, 'b': 3},
  '2': {'a': 2, 'b': 4}
}

total = Counter()

for d in x.values():
    total.update(d)

print(total)
结果:

Counter({'b': 7, 'a': 3})
update
计数器的工作方式不同,它不会覆盖键,而是增加当前值,这是与
defaultdict(int)
的细微区别之一)

我们可以创建一个默认dict来迭代嵌套字典中的每个键、值对,并汇总每个键的总数。这将使a的计算结果为3,b的计算结果为7。在我们增加值之后,我们可以进行简单的字典理解,为总计创建另一个嵌套字典,并将a/b键及其和作为值。以下是您的输出:

{'1': {'a': 1, 'b': 3}, '2': {'a': 2, 'b': 4}, 'total': {'a': 3, 'b': 7}}
我们可以创建一个默认dict来迭代嵌套字典中的每个键、值对,并汇总每个键的总数。这将使a的计算结果为3,b的计算结果为7。在我们增加值之后,我们可以进行简单的字典理解,为总计创建另一个嵌套字典,并将a/b键及其和作为值。以下是您的输出:

{'1': {'a': 1, 'b': 3}, '2': {'a': 2, 'b': 4}, 'total': {'a': 3, 'b': 7}}

展示您如何尝试调整该问题的答案,以及在何处失败以及如何失败,我们可以帮助您调试问题。因为事实上,你的问题与那一个问题是一样的,只是你想总结
x.values()
,而不仅仅是
x
,所以如果你不告诉我们,我们无法猜测你可能会在哪里陷入困境。展示你是如何尝试从该问题中调整答案的,以及在哪里和如何失败,我们可以帮助你调试你的问题。因为事实上,你的问题和那个问题是一样的,只是你想总结
x.values()
,而不仅仅是
x
,所以如果你不告诉我们,我们无法猜测你可能会被困在哪里。这听起来还是太复杂了,只是为了创建一个单行线,尽管如此,这听起来还是过于复杂了,只是为了创建一个单行线