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, но мне интересно, почему приведенный выше код не работает.
Ответы
Ответ 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()...)
Я попробовал список, и он не работал, поэтому просто разместил его для всех.