Создать вложенное дерево из списка - PullRequest
0 голосов
/ 17 ноября 2018

Из списка списков я хотел бы создать вложенный словарь, ключи которого указывали бы на следующее значение в подсписке.Кроме того, я хотел бы посчитать, сколько раз происходила последовательность значений подсписков.

Пример:

Из списка списков как такового:

[['a', 'b', 'c'],
['a', 'c'],
['b']]

Я хотел бы создать вложенный словарь как таковой:

{
  'a': {
          {'b': 
                {
                'c':{}
                'count_a_b_c': 1
                }
            'count_a_b*': 1
          }, 
          {'c': {},
           'count_a_c': 1
          }
          'count_a*': 2
        },
  {
  'b':{},
  'count_b':1
  }
}

Обратите внимание, что имена ключей для счетчиков не имеют значение, они были названы как таковые для иллюстрации.

1 Ответ

0 голосов
/ 17 ноября 2018

Мне было интересно, как бы я это сделал, и придумал это:

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 ...

но это может быть отправной точкой для решения вашей проблемы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...