У меня есть список продуктов, образующих дерево (ID, название продукта, тип счета, ссылка на родительский ID):
text = """
1,Product1,INVOICE_FEE,
3,Product3,INVOICE_FEE,
7,Product7,DEFAULT,
2,Product2,DEFAULT,7
4,Product4,DEFAULT,7
5,Product5,DEFAULT,2
"""
Следующий код создает пути:
lines = [ l.strip() for l in text.strip().splitlines() ]
hierarchy = [ tuple(l.split(',')) for l in lines ]
parents = defaultdict(list)
for p in hierarchy:
parents[p[3]].append(p)
def pathsMet(parents, node=''):
childNodes = parents.get(node)
if not childNodes:
return [[]]
paths = []
for ID, productName, invoiceType, parentID in childNodes:
for p in pathsMet(parents, ID):
paths.append([productName] + p)
return paths
Список путей в результате:
[['Product1'], ['Product3'], ['Product7', 'Product4'], ['Product7', 'Product2', 'Product5']]
Возможна ситуация, когда некоторые пути будут повторяться, например, для списка:
text = """
7,Product7,DEFAULT,
2,Product2,DEFAULT,7
4,Product4,DEFAULT,7
5,Product4,DEFAULT,7
"""
будет (могут быть многоуровневые вложенные пути дублирование):
[['Product7'], ['Product7', 'Product2'], ['Product7', 'Product4'], ['Product7', 'Product4']]
Как избавиться от повторяющихся путей, но при этом сохраняя правильный порядок внутри путей?