Преобразование списка Python в словарь через понимание

Скажем, у меня есть функция, которая возвращает словарь, и я перебираю эту функцию. Это создаст список словарей. Я хочу преобразовать это в словарь. Я вызываю свою функцию следующим образом:

x = [_myfunction(element) for element in list_of_elements]

В результате скажем x:

x = [{'one': {'two':'2'}, 'three' : '3'}, {'four':'five', 'six':{'seven':7}}]

и я хочу преобразовать в y:

y = {'one': {'two':'2'}, 'three' : '3', 'four':'five', 'six':{'seven':7}}

Есть ли способ вызвать _myfunction() для list_of_elements, чтобы он напрямую приводил к y? Может быть, с пониманием словаря вместо вышеприведенного понимания списка? Или какой самый лаконичный код превратить x в y. (Надеюсь, не скучно и не используя цикл for! :-))

Спасибо, labjunky


person labjunky    schedule 10.04.2014    source источник
comment
y — это кортеж словарей, вряд ли улучшение. Вы хотели вместо этого иметь один словарь с ключами 'one', 'three', 'four' и 'six'?   -  person Martijn Pieters    schedule 10.04.2014
comment
y, который вы хотите, это не словарь, это кортеж из 2 элементов (2 словаря).   -  person Christian    schedule 10.04.2014
comment
Если вам действительно нужен один словарь, вам придется сообщить нам, что вы хотите делать, когда один ключ появляется в двух (или более) словарях.   -  person Dunno    schedule 10.04.2014
comment
оппс да ты прав. Я исправил это. В случае идентичных ключей перезапись возможна.   -  person labjunky    schedule 10.04.2014


Ответы (1)


Вы можете объединить словари с помощью метода dict.update:

y = {}
for element in list_of_elements:
  y.update(_myfunction(element))

Вы также можете использовать (двойной цикл) dict-comprehension:

y = {
    k:v
    for element in list_of_elements
    for k,v in _myfunction(element).items()
}

Наконец, если вы возьмете любой из ответов на этот вопрос, для слияния двух диктов (и назовите его merge_dicts), вы можете используйте reduce, чтобы объединить более двух:

dicts = [_myfunction(element) for element in list_of_elements]
y = reduce(merge_dicts, dicts, {})

В любом случае, в случае повторяющихся ключей dict, более поздние ключи перезаписывают более ранние.

person shx2    schedule 10.04.2014