Создание списка списков из вложенных значений словаря (дерева) - PullRequest
1 голос
/ 19 июня 2020

Я использовал иерархическую кластеризацию для создания дерева кластеров.

Результат:

dic = {6: {2: 2, 5: {3: 3, 4: {0: 0, 1: 1}}}}

списки в списке в соответствии с кластерами:

[ [[6]],
  [[2], [5]],
  [[2], [3], [4]],
  [[2], [3], [0], [1]] ]

списки в списке в соответствии со значениями:

[ [[2, 3, 0, 1]],
  [[2], [3, 0, 1]],
  [[2], [3], [0, 1]],
  [[2], [3], [0], [1]] ]

В итоге я хочу получить «списки в списке по значениям».

Спасибо

Ответы [ 2 ]

1 голос
/ 19 июня 2020

flat выравнивает входной массив
walk рекурсивно просматривает дерево и распаковывает значения

окончательное понимание списка, которое генерирует массив той же длины, что и количество извлеченных значений
каждый элемент массива представляет собой массив с массивы одиночных значений x из l (l[i:i+1]), объединенные с фрагментом массива остальных элементов в l (l[x:])

dic = {6: {2: 2, 5: {3: 3, 4: {0: 0, 1: 1}}}}
flat = lambda l: [item for sublist in l for item in sublist]
walk = lambda node: flat([walk(v) if type(v) is dict else [v] for v in node.values()])

l = walk(dic)
print([[l[i:i+1] for i in range(x)]+[l[x:]] for x in range(len(l))])
1 голос
/ 19 июня 2020

Я просто потратил на это слишком много времени:

def list_of_list(d):
    if type(d)!=dict:
        return [[[d]]]
    results=[]
    for k,value in d.items():
        results.append(list_of_list(value))
    L=len(max(results,key=len))
    for i in range(len(results)):
        j=len(results[i]) 
        results[i].extend([results[i][j-1]]*(L-j))
    outputtop=[v  for result in results for v in result[0][0]]
    output=[[outputtop]]
    for l in range(L):
        output.append([ val  for result in results for  val in result[l]])
    return output
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...