Установить список как ключи в dict с неизвестным количеством элементов списка

1

Есть ли способ установить вложенные ключи на основе списка? У меня есть следующий код:

def setDictKeys (dict, atKey, keysList):
    for key in keysList:
        dict[atKey][key] = {}

И, позвонив

setDictKeys(dict, ["a", "b"], someKeysList)

Я хочу, чтобы словарь выглядел так:

dict["a"]["b"]["key from someKeysList"] = {}

Спасибо!

  • 0
    list не может быть установлен в качестве ключа словаря. Вы можете проверить defaultdict из пакета collections и определить тип по умолчанию как dict. Также для вложенного случая вам нужно будет снова установить новый defaultdict.
Теги:
list
dictionary

3 ответа

4
Лучший ответ

Вы можете просто использовать цикл для 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': {}}}}
  • 0
    Это работало отлично. Спасибо!
1

Ниже приведено функциональное решение с использованием 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: {}})})})
1

Вот еще один способ для конкретного вопроса

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']))
  • 0
    «Этот конкретный вопрос» задает вопрос о «неизвестном количестве элементов списка».

Ещё вопросы

Сообщество Overcoder
Наверх
Меню