Есть ли способ установить вложенные ключи на основе списка? У меня есть следующий код:
def setDictKeys (dict, atKey, keysList):
for key in keysList:
dict[atKey][key] = {}
И, позвонив
setDictKeys(dict, ["a", "b"], someKeysList)
Я хочу, чтобы словарь выглядел так:
dict["a"]["b"]["key from someKeysList"] = {}
Спасибо!
Вы можете просто использовать цикл для atKey
отдельных клавиш в atKey
и погружения "глубже" во вложенный dict.
def setDictKeys (d, atKey, keysList):
for key in atKey:
d = d.setdefault(key, {})
for key in keysList:
d[key] = {}
d = {}
setDictKeys(d, ["a", "b"], ["some", "Keys", "List"])
# {'a': {'b': {'some': {}, 'Keys': {}, 'List': {}}}}
Ниже приведено функциональное решение с использованием collections.defaultdict
. В зависимости от вашего варианта использования вам может не понадобиться вручную создавать дочерние словари. Вы можете просто использовать вложенный defaultdict
.
from collections import defaultdict
from operator import getitem
from functools import reduce
tree = lambda: defaultdict(tree)
d = tree()
def setDictKeys(dataDict, atKey, keysList):
reduce(getitem, atKey, dataDict).update({i: {} for i in keysList})
setDictKeys(d, ['a', 'b'], [1, 2, 3])
print(d)
defaultdict({'a': defaultdict({'b': defaultdict({1: {}, 2: {}, 3: {}})})})
Вот еще один способ для конкретного вопроса
def fun(d,atkey,listofkeys):
d[atkey[0]]={atkey[1]:{}}
for i in listofkeys:
d[atkey[0]][atkey[1]][i] = {}
return d
print(fun({'1':'h999'},['a','b'],['hi','hello','abcd','a','b']))
list
не может быть установлен в качестве ключа словаря. Вы можете проверитьdefaultdict
из пакетаcollections
и определить тип по умолчанию как dict. Также для вложенного случая вам нужно будет снова установить новый defaultdict.