Python: могу ли я использовать dict update внутри функции карты? - PullRequest
0 голосов
/ 20 июня 2020

У меня есть следующий ввод inp = [{1:100}, {3:200}, {8:300}], и я хочу преобразовать его в словарь. Я могу сделать

dct = dict()  
for a in inp:  
    dct.update(a)

или могу

_ = [dct.update(a) for a in inp]

Но я бы хотел сделать что-то вроде:

map(dct.update, inp)

Ответы [ 4 ]

5 голосов
/ 20 июня 2020

Метод map строит итератор, поэтому вычисления производятся только тогда, когда это необходимо. Поэтому вам нужно принудительно выполнить вычисления, используя список, например

list(map(dct.update, inp))
print(dct)

Но вы не должны использовать ни понимание списка, ни операцию map, которые здесь используются для получения значений

Лучше оставить for-loop или dict-comprehension

dct = {key:val for item in inp for key,val in item.items()}
1 голос
/ 20 июня 2020

При использовании карты цепочки:

from collections import ChainMap

inp = [{1: 100}, {3: 200}, {8: 300}]
data = dict(ChainMap(*inp))
1 голос
/ 20 июня 2020

Зачем использовать карту для этой задачи?

Если вы хотите решить ее в одну строку, вы можете просто сделать:

dct={k:v for x in inp for k,v in x.items()}
0 голосов
/ 20 июня 2020

Вы хотите reduce, а не map. map создает последовательность, применяя функцию к каждому элементу данной последовательности, тогда как reduce накапливает объект над последовательностью.

from functools import reduce
inp = [{1:100}, {3:200}, {8:300}]
dct = {}
reduce(lambda d1, d2: (d1.update(d2) or d1), inp, dct)
{1: 100, 3: 200, 8: 300}

Эта lambda часть может показаться сложной. Это создает функцию, которая обновляет dict и возвращает сам словарь. Это связано с тем, что reduce ожидает, что функция накопления вернет обновленный объект, а dict.update() вернет None. Поскольку None интерпретируется как False, оператор or возвращает вторую переменную, которая является обновленным словарем.

Этот трюк or засчитывается @ kostya-goloveshko в этом потоке: Почему python dict.update () не возвращает объект?

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