Как объединить два или более слова в один, сохранив несколько значений одного и того же ключа в виде списка? - PullRequest
0 голосов
/ 18 октября 2018

У меня есть два или более словаря, я хотел бы объединить их как один с сохранением нескольких значений того же ключа, что и список.Я не смог бы поделиться исходным кодом, поэтому, пожалуйста, помогите мне со следующим примером.

Ввод:

a= {'a':1, 'b': 2}
b= {'aa':4, 'b': 6}
c= {'aa':3, 'c': 8}

Вывод:

c= {'a':1,'aa':[3,4],'b': [2,6], 'c': 8}

Ответы [ 3 ]

0 голосов
/ 18 октября 2018

Пожалуйста, найдите ниже, чтобы решить вашу проблему.Я надеюсь, что это сработает для вас.

from collections import defaultdict

a = {'a':1, 'b': 2}
b =  {'aa':4, 'b': 6}
c={'aa':3, 'c': 8}

dd = defaultdict(list)

for d in (a,b,c): 
    for key, value in d.items():
        dd[key].append(value)

print(dd)
0 голосов
/ 18 октября 2018

Используйте defaultdict для автоматического создания словарной записи с пустым списком.

Чтобы обработать все исходные словари в цикле single , используйте itertools.chain.

Основной цикл просто добавляет значение из текущего элемента в список под текущим ключом.

Как вы писали, для случаев, когда под каким-то ключом находится только один элемент, выдолжен генерировать рабочий словарь (используя диктонное понимание ), ограниченный элементами со значением (списком), содержащими только один элемент.Значение такого элемента должно содержать только первое (и единственное) число из списка источников.

Затем используйте этот словарь для обновления d.

Так что весь скрипт может быть на удивление коротким, как показано ниже:

from collections import defaultdict
from itertools import chain
a = {'a':1, 'b': 2}
b = {'aa':4, 'b': 6}
c = {'aa':3, 'c': 8}
d = defaultdict(list)
for k, v in chain(a.items(), b.items(), c.items()):
    d[k].append(v)
d.update({ k: v[0] for k, v in d.items() if len(v) == 1 })

Как видите, фактический код обработки содержится только в 4 (последних) строках.

Если вы напечатаете d, результат будет:

defaultdict(list, {'a': 1, 'b': [2, 6], 'aa': [4, 3], 'c': 8})
0 голосов
/ 18 октября 2018

Я предлагаю вам прочитать defaultdict : он позволяет вам предоставить фабричный метод, который инициализирует отсутствующие ключи, т. Е. Если ключ ищется, но не найден, он создает значение, вызывая factory_method(missing_key),Посмотрите на этот пример, это может прояснить ситуацию:

from collections import defaultdict

a = {'a': 1, 'b': 2}
b = {'aa': 4, 'b': 6}
c = {'aa': 3, 'c': 8}

stuff = [a, b, c]
# our factory method is the list-constructor `list`,
# so whenever we look up a value that doesn't exist, a list is created;
# we can always be sure that we have list-values
store = defaultdict(list)

for s in stuff:
    for k, v in s.items():
        # since we know that our value is always a list, we can safely append
        store[k].append(v)

print(store)

Это имеет «обратную сторону» в создании одноэлементных списков для единичных вхождений значений, но, возможно, вы сможете обойти это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...