Подтвердить что ты не робот

"Сглаживание" списка словарей

Итак, моя цель - перейти от:

fruitColourMapping = [{'apple': 'red'}, {'banana': 'yellow'}]

to

finalMap = {'apple': 'red', 'banana': 'yellow'}

Я получил способ:

 from itertools import chain
 fruits = list(chain.from_iterable([d.keys() for d in fruitColourMapping]))
 colour = list(chain.from_iterable([d.values() for d in fruitColourMapping]))
 return dict(zip(fruits, colour))

Есть ли еще более пифонический путь?

4b9b3361

Ответ 1

finalMap = {}
for d in fruitColourMapping:
    finalMap.update(d)

Ответ 2

Зачем копировать вообще?

В Python 3 вы можете использовать новый ChainMap:

ChainMap объединяет несколько диктов (или других сопоставлений) вместе для создания единого обновляемого представления.
Подлежащие сопоставления хранятся в списке. Этот список является общедоступным и могут быть доступны или обновлены с использованием атрибута maps. Здесь нет другое государство. Поиск последовательно просматривает базовые сопоставления пока не будет найден ключ. Напротив, записи, обновления и удаления работают только с первым отображением.

Все, что вам нужно, - это изменить имена, чтобы они соответствовали Соглашения об именах Python):

from collections import ChainMap
fruit_colour_mapping = [{'apple': 'red'}, {'banana': 'yellow'}]
final_map = ChainMap(*fruit_colour_mapping)

И затем вы можете использовать все обычные операции отображения:

# print key value pairs:
for element in final_map.items():
    print(element)

# change a value:
final_map['banana'] = 'green'    # supermarkets these days....

# access by key:
print(final_map['banana'])

Ответ 3

{k: v for d in fruitColourMapping for k, v in d.items()}

Ответ 4

Вместо того, чтобы деконструировать и восстанавливать, просто скопируйте и обновите:

final_map = {}
for fruit_color_definition in fruit_color_mapping:
    final_map.update(fruit_color_definition)

Ответ 5

dict(d.items()[0] for d in fruitColourMapping)

Ответ 6

Подход

Используйте reduce, чтобы применить каждый dict к пустым инициализаторам. Поскольку dict.update всегда возвращает None, используйте d.update(src) or d, чтобы дать reduce желаемое возвращаемое значение.

Код

final_dict = reduce(lambda d, src: d.update(src) or d, dicts, {})

Тест

>>> dicts = [{'a': 1, 'b': 2}, {'b': 3, 'c': 4}, {'a': 6}]
>>> final_dict = reduce(lambda d, src: d.update(src) or d, dicts, {})
>>> final_dict
{'a': 6, 'c': 4, 'b': 3}

Ответ 7

Вы также можете попробовать:

finalMap = dict(item for mapping in fruitColourMapping for item in mapping.items())

Ответ 8

В Python 3.5, распаковка словаря (см. PEP 448):

a, b = [{'apple': 'red'}, {'banana': 'yellow'}]
{**a, **b}
# {'apple': 'red', 'banana': 'yellow'}