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

Python: использовать ключи из нескольких словарей?

У меня есть 5 словарей, и я хочу объединить их ключи.

alldict =  [dict1, dict2, dict3, dict4, dict5]

Я пробовал

allkey = reduce(lambda x, y: set(x.keys()).union(y.keys()), alldict)

но это дало мне ошибку

AttributeError: 'set' object has no attribute 'keys'

Я делаю это неправильно? Я использую обычный forloop, но мне интересно, почему приведенный выше код не работает.

4b9b3361

Ответ 1

Ваше решение работает для первых двух элементов в списке, но затем dict1 и dict2 попадают в набор, и этот набор помещается в ваш лямбда как x. Итак, теперь x больше не имеет метода keys().

Решение состоит в том, чтобы сделать x с самого начала, инициализируя редукцию пустым множеством (которое является нейтральным элементом объединения).

Попробуйте с инициализатором:

allkey = reduce(lambda x, y: x.union(y.keys()), alldict, set())

Альтернативой без lambdas будет:

allkey = reduce(set.union, map(set, map(dict.keys, alldict)))

Ответ 2

Я думаю, что @chuck уже ответил на вопрос, почему он не работает, но более простой способ сделать это - это помнить, что метод union может принимать несколько аргументов:

allkey = set().union(*alldict)

делает то, что вы хотите, без каких-либо циклов или лямбдов.

Ответ 3

Простая стратегия для нефункциональных нейронов (каламбур):

allkey = []

for dictio in alldict:
    for key in dictio:
        allkey.append(key)

allkey = set(allkey)

Мы можем преобразовать этот код в большую форму сортировщика с использованием заданных понятий:

allkey = {key for dictio in alldict for key in dictio}

Этот однострочный слой по-прежнему очень читается по сравнению с обычным циклом. Ключом для преобразования вложенного цикла в список или установкой понимания является запись внутреннего цикла (того, который изменяется быстрее в вложенном цикле) в качестве последнего индекса (т.е. for key in dictio).

Ответ 4

Еще один способ, потому что сено:

a={}; [ a.update(b) for b in alldict ] and a.keys()

или чуть более таинственный

reduce(lambda a, b: a.update(b) or a, alldict, {}).keys()

(Я уверен, что нет встроенной функции, эквивалентной

def f(a,b):
   r = {}
   r.update(a)
   r.update(b)
   return r

есть?)

Ответ 5

set().union(dict1.keys(),dict2.keys()...)

Я попробовал список, и он не работал, поэтому просто разместил его для всех.