转换分隔字符串列表以树形/嵌套字典,使用python(convert a list of delim

2019-09-03 04:12发布

我想转换点分隔的字符串列表,如

['one.two.three.four', 'one.six.seven.eight', 'five.nine.ten', 'twelve.zero']

成树(嵌套的列表或类型的字典 - 什么,很容易走过)。 真实数据碰巧具有不同长度的1至4个点分隔的部分,并且具有2200个的记录的总额。 我的实际目标是填补该组4个QComboBox'es与此数据,在以使第一QComboBox填充有第一组项[“一个”,“5”,“12”](无重复)。 然后根据选择的项目,第二QComboBox充满了它的相关项目:为“一”这将是:“两节”,“六”],等等,如果有另一个嵌套级别。

到目前为止,我已经有了一个工作列表 - >嵌套类型的字典解决方案,但它是可怕的慢,因为我经常使用的dict()。 我似乎有麻烦,它重新设计的defaultdict的方式方便地制定出适当填充组合框。

我当前的代码:

def list2tree(m):
    tmp = {}
    for i in range(len(m)):
        if m.count('.') == 0:
            return m
        a = m.split('.', 1)
        try:
            tmp[a[0]].append(list2tree(a[1]))
        except (KeyError, AttributeError):
            tmp[a[0]] = list2tree(a[1])
    return tmp

main_dict = {}
i = 0
for m in methods:
    main_dict = list2tree(m)
    i += 1
    if (i % 100) == 0: print i, len(methods)
print main_dict, i, len(methods)

Answer 1:

ls = ['one.two.three.four', 'one.six.seven.eight', 'five.nine.ten', 'twelve.zero']
tree = {}

for item in ls:
    t = tree
    for part in item.split('.'):
        t = t.setdefault(part, {})

结果:

{
 "twelve": {
  "zero": {}
 }, 
 "five": {
  "nine": {
   "ten": {}
  }
 }, 
 "one": {
  "six": {
   "seven": {
    "eight": {}
   }
  }, 
  "two": {
   "three": {
    "four": {}
   }
  }
 }
}


文章来源: convert a list of delimited strings to a tree/nested dict, using python