Is it possible to turn a list into a nested dict of keys *without* recursion?

无人久伴 提交于 2020-01-21 06:59:27

问题


Supposing I had a list as follows:

mylist = ['a','b','c','d']

Is it possible to create, from this list, the following dict without using recursion/a recursive function?

{
  'a': {
    'b': {
      'c': {
        'd': { }
      }
    }
  }
}

回答1:


For the simple case, simply iterate and build, either from the end or the start:

result = {}
for name in reversed(mylist):
    result = {name: result}

or

result = current = {}
for name in mylist:
    current[name] = {}
    current = current[name]

The first solution can also be expressed as a one-liner using reduce():

reduce(lambda res, name: {name: res}, reversed(mylist), {})



回答2:


For this simple case at least, yes:

my_list = ['a', 'b', 'c', 'd']
cursor = built_dict = {}
for value in my_list:
    cursor[value] = {}
    cursor = cursor[value]



回答3:


Or for fancyness and reduced readability:

dict = reduce(lambda x, y: {y: x}, reversed(myList), {})



回答4:


It's worth mentioning that every recursion can be converted into iteration, although sometimes that might not be so easy. For the particular example in the question, it is simple enough, it's just a matter of accumulating the expected result in a variable and traversing the input list in the appropriate order. This is what I mean:

def convert(lst):
    acc = {}
    for e in reversed(lst):
        acc = {e: acc}
    return acc

Or even shorter, the above algorithm can be expressed as a one-liner (assuming Python 2.x, in Python 3.x reduce was moved to the functools module). Notice how the variable names in the previous solution correspond to the lambda's parameters, and how in both cases the initial value of the accumulator is {}:

def convert(lst):
    return reduce(lambda acc, e: {e: acc}, reversed(lst), {})

Either way, the function convert works as expected:

mylist = ['a','b','c','d']
convert(mylist)

=> {'a': {'b': {'c': {'d': {}}}}}



回答5:


mydict = dict()
currentDict = mydict
for el in mylist:
  currentDict[el] = dict()
  currentDict = currentDict[el]


来源:https://stackoverflow.com/questions/13238255/is-it-possible-to-turn-a-list-into-a-nested-dict-of-keys-without-recursion

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!