【发布时间】:2017-09-29 11:31:24
【问题描述】:
我有一个结构如下的列表:
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
输出-:
{'a': ['a-b', 'a-x-y', 'a-c', 'a-d'], 'b': ['b-c'], 'c-d': ['c-d-e', 'c-d-f']}
请帮助我改进此代码,或者帮助我使用具有完整结构的字典,其中包含所有子分类。谢谢
【问题讨论】:
-
当我使用您的示例输入数据运行此函数时,它会返回
None。你能显示你得到的输出吗? -
糟糕,最后忘记了返回猫。可能就是这样。当我运行它时,我得到 {'a': ['a-b', 'ax-y', 'a-c', 'a-d'], 'b': ['b-c'], ' cd': ['cd-e', 'cd-f']}
-
至少对于您提供的输入大小,我会说这非常强大。您可以在放大输入大小时使用此方法来分析函数:gist.github.com/JacobIRR/318143230a6ced24ce82882079b7ae10
len和join最常使用。 -
我明白了.. 谢谢。关于如何制作包含所有子类别的字典的任何想法?
-
我会一直盯着它看,但我还不明白缩进是怎么回事以及它如何影响输出
标签: python algorithm list dictionary nested