Мне было интересно, как бы я это сделал, и придумал это:
lst = [['a', 'b', 'c'],
['a', 'c'],
['b']]
tree = {}
for branch in lst:
count_str = 'count_*'
last_node = branch[-1]
cur_tree = tree
for node in branch:
if node == last_node:
count_str = count_str[:-2] + f'_{node}'
else:
count_str = count_str[:-2] + f'_{node}_*'
cur_tree[count_str] = cur_tree.get(count_str, 0) + 1
cur_tree = cur_tree.setdefault(node, {})
здесь ничего особенного не происходит ...
для вашего примера:
import json
print(json.dumps(tree, sort_keys=True, indent=4))
производит:
{
"a": {
"b": {
"c": {},
"count_a_b_c": 1
},
"c": {},
"count_a_b_*": 1,
"count_a_c": 1
},
"b": {},
"count_a_*": 2,
"count_b": 1
}
он точно не воспроизводит то, что вы представляете, но это отчасти из-за того, что ваш желаемый результат не является допустимым словарем Python ...
но это может быть отправной точкой для решения вашей проблемы.