Я не уверен, как вы инициализируете dict2
, поэтому трудно указать на проблему в вашем коде. Сказав это, ниже приведены некоторые способы решения этой проблемы.
Предполагая, что ваши данные в формате вложенного словаря {'word1': {'111.txt': 1, '112.txt': 3, '113.txt': 2}, 'word2':..}
, я полагаю, что вы стремитесь к:
d = {
'word1': {'111.txt': 1, '112.txt': 3, '113.txt': 2},
'word2': {'111.txt': 2, '112.txt': 2, '113.txt': 1},
'word3': {'111.txt': 1, '113.txt': 1},
'word4': {'111.txt': 3, '113.txt': 2},
'word5': {'111.txt': 5, '113.txt': 1}
}
counts = {}
# only need to iterate values here. 'word1', 'word2' etc. not needed in output
for v1 in d.values():
# iterate sub dictionary values and keys. These are needed for output.
for k, v2 in v1.items():
# Use dict.get() to set initial value to 0 if key doesn't exist
counts[k] = v2 + counts.get(k, 0)
print(counts)
# {'111.txt': 12, '112.txt': 5, '113.txt': 7}
Или даже к простому подходу, подобному приведенному ниже:
counts = {}
for v1 in d.values():
for k, v2 in v1.items():
# initialize to 0 if key doesn't exist
if k not in counts:
counts[k] = 0
# Continue counting, since above condition will prevent KeyError
counts[k] += v2
print(counts)
# {'111.txt': 12, '112.txt': 5, '113.txt': 7}
Кроме того, вы также можете использовать collections.Counter
здесь:
from collections import Counter
d = {
'word1': {'111.txt': 1, '112.txt': 3, '113.txt': 2},
'word2': {'111.txt': 2, '112.txt': 2, '113.txt': 1},
'word3': {'111.txt': 1, '113.txt': 1},
'word4': {'111.txt': 3, '113.txt': 2},
'word5': {'111.txt': 5, '113.txt': 1}
}
counts = Counter()
for v in d.values():
counts.update(v)
print(counts)
# Counter({'111.txt': 12, '113.txt': 7, '112.txt': 5})
Который использует Counter.update()
, чтобы легко добавлять значения.
Здесь также можно использовать collections.defaultdict(int)
:
from collections import defaultdict
d = {
'word1': {'111.txt': 1, '112.txt': 3, '113.txt': 2},
'word2': {'111.txt': 2, '112.txt': 2, '113.txt': 1},
'word3': {'111.txt': 1, '113.txt': 1},
'word4': {'111.txt': 3, '113.txt': 2},
'word5': {'111.txt': 5, '113.txt': 1}
}
counts = defaultdict(int)
for v1 in d.values():
for k, v2 in v1.items():
counts[k] += v2
print(counts)
# defaultdict(<class 'int'>, {'111.txt': 12, '112.txt': 5, '113.txt': 7})
Примечание: Counter
и defaultdict
являются подклассами dict
, так что вы можете обращаться с ними как с обычными словарями. Если вы действительно хотите, чтобы результат был dict
, вместо этого вы можете привести dict()
:
print(dict(counts))
# {'111.txt': 12, '112.txt': 5, '113.txt': 7}
Они также обрабатывают инициализацию для вас, поэтому вам не нужно инициализировать новые ключи с помощью 0
.