python - 具有来自单个列表的嵌套类别的字典

标签 python algorithm list dictionary nested

我有一个结构如下的列表:

arr = [ ['a'],
                ['a','b'],
                ['a','x','y'],
                ['a','c'],
                    ['a','c','a'],
                    ['a','c','b'],
                        ['a','c','b','a'],
                        ['a','c','b','b'],
                ['a','d'],
            ['b'],
                ['b','c'],
                    ['b','c','a'],
                    ['b','c','b'],                  
            ['c','d'],
                ['c','d','e'],
                ['c','d','f'],
                    ['c','d','f','a'],
                    ['c','d','f','b'],
                        ['c','d','f','b','a'],
                ]

正如您所观察到的,该列表具有一些独特的元素,然后后续元素在独特元素的基础上构建,直到出现新的独特元素。这些应该是类别和子类别。所以 [a] , [b] , ['c','d'] 是广义的主要类别,然后根据与上述相同的原则,在子类别中还有进一步的子类别。理想情况下,我希望将类别和子类别作为字典。最终结果应该类似于:

{'a': ['a-b',
     'a-x-y',
     {'a-c': 
           ['a-c-a',
            {'a-c-b':
                    ['a-c-b-a', 
                     'a-c-b-b']
            }]
     }
    ],
'b' : ................
'c-d': ...............}

我也可以只处理第一级子分类并完全丢弃其余部分。在这种情况下,输出将是:

{'a': ['a-b', 'a-x-y', 'a-c', 'a-d'], 'b': ['b-c'], 'c-d': ['c-d-e', 'c-d-f']}

我已经为第二种情况编写了代码,但我不确定这是否是解决此问题的可靠方法:

def arrange(arr):
cat = {"-".join(arr[0]): ["-".join(arr[1])]}
main = 0
for i in range(2,len(arr)):
    l = len(arr[main])
    if arr[main] == arr[i][0:l]:
        cat["-".join(arr[main])].append("-".join(arr[i]))
    else:
        cat["-".join(arr[i])] = []
        main = i
for k,v in cat.items():
    found = True
    i = 0
    while i < len(v)-1:
        f_idx = i + 1
        while  v[i] in v[f_idx]:
            v.pop(f_idx)
        i += 1
return cat

Output-:

{'a': ['a-b', 'a-x-y', 'a-c', 'a-d'], 'b': ['b-c'], 'c-d': ['c-d-e', 'c-d-f']}

请帮助我改进这段代码,或者帮助我使用具有完整结构的字典,其中包含所有子分类。谢谢

最佳答案

最后,我相信我已经将您描述为第一级子分类并完全丢弃其余部分。

诀窍是根据列表中的项目(键)不是后续项目(值)的子列表来创建操作。
相同的逻辑用于删除重复项。

from collections import defaultdict

#Function that compares two lists even with duplicate items
def contains_sublist(lst, sublst):
    n = len(sublst)
    return any((sublst == lst[i:i+n]) for i in xrange(len(lst)-n+1))

#Define default dict of list
aDict = defaultdict(list)
it = iter(arr)

#Format key 
key = '-'.join(next(it))
s = list(key)

# Loop that collects keys if key is not sublist else values
for l in it:
    if contains_sublist(l, s):
        aDict[key].append(l)
    else:
        key = '-'.join(l)
        s = l

#Loop to remove duplicate items based upon recurrance of sublist
it = iter(aDict.keys())
for k in it:
    dellist = []

    for s in aDict[k]:
        for l in aDict[k]:
            if l != s:
                if contains_sublist(l, s):
                    if not l in dellist:        
                        dellist.append(l)
    for l in dellist:        
        try:
            aDict[k].remove(l)
        except ValueError:
            pass

#Create final dict by concatenating list of list with '-'
finaldict = {k:[ '-'.join(i) for i in v ] for k,v in aDict.iteritems()}

结果:

Python 2.7.9 (default, Dec 10 2014, 12:24:55) [MSC v.1500 32 bit (Intel)] on win32
Type "copyright", "credits" or "license()" for more information.
>>> ================================ RESTART ================================
>>> 
>>> finaldict
{'a': ['a-b', 'a-x-y', 'a-c', 'a-d'], 'b': ['b-c'], 'c-d': ['c-d-e', 'c-d-f']}
>>> 

关于python - 具有来自单个列表的嵌套类别的字典,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43729466/

相关文章:

如何将大面积分割成凸多边形的算法

r - 了解数据框列表的 lapply

list - SML 函数具有 2 个返回 XOR 的列表——已修复

java - 如何按私有(private)字段对列表进行排序?

python - 如何创建特定类型但为空的列表

python - cython 将指针传递给扩展类型的构造函数

python - 将 yaml 文件加载为 dict

捕获游戏的算法

Python 无法将项目复制到列表

algorithm - 从流中查找运行介质