@Aquinary
Хинафаг :)

Каким образом можно выполнить слияние двух и более словарей?

Это:
collections = [{'href': 'link1', 'wait': 1},
               {'href': 'link1', 'wait': 2},
               {'href': 'link2', 'wait': 1},
               {'href': 'link3', 'wait': 0}]

В это:
collections = [{'href': 'link1', 'wait': 3},
               {'href': 'link2', 'wait': 1},
               {'href': 'link3', 'wait': 0}]


Я пробовал делать через Counter, но он работает только в том случае, если значения ключей - числа. Ну или я не так что-то делал там :)

Заранее благодарен за помощь! Решение в голову никак не приходит, ну совсем никак.
  • Вопрос задан
  • 95 просмотров
Решения вопроса 1
YardalGedal
@YardalGedal
yeah boy
Для настоящего слияния словарей
{**a, **b, **c}

Вам нужно не слияние словарей
result = []
for c in collections:
    inced = 0
    for n, collection in enumerate(result):
        if collection["href"] == c["href"]: 
            result[n]["wait"] += c["wait"]
            inced = 1
    if inced == 0: result.append(c)


Можно попробовать и так
result = []
for c in collections:
    for n, collection in enumerate(result):
        if collection["href"] == c["href"]: 
            result[n]["wait"] += c["wait"]
            break
    else: result.append(c)
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
@kzoper
def merge_dicts(*dict_args):
    """
    Given any number of dicts, shallow copy and merge into a new dict,
    precedence goes to key value pairs in latter dicts.
    """
    result = {}
    for dictionary in dict_args:
        result.update(dictionary)
    return result

z = merge_dicts(a, b, c, d, e, f, g)
Ответ написан
@Animkim
Питон вокруг меня
res = defaultdict(int)
for d in collections:
    res[d['href']] += d['wait']
res = [dict(zip(('href', 'wait'), c)) for c in sorted(res.items())]

Python2, на третьем возможно нужно что-нибудь поправить. Большая часть кода занимается восстановлением оригинальной структуры, думаю можно попроще написать. Исходил из того что нам заранее известны ключи словаря и их количество.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через TM ID
Похожие вопросы
Popmechanic Москва
от 100 000 до 150 000 руб.
Panda Media Нижний Новгород
от 70 000 руб.
НЛ Континент Новосибирск
от 60 000 до 100 000 руб.
17 авг. 2018, в 17:10
15000 руб./за проект
17 авг. 2018, в 16:58
60000 руб./за проект
17 авг. 2018, в 16:55
10000 руб./за проект