【问题标题】:Creating list of lists from nested dictionary values (tree)从嵌套字典值(树)创建列表列表
【发布时间】:2020-10-09 16:30:10
【问题描述】:

我已经使用层次聚类来创建聚类树。

这会导致:

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

我想要结束的是“根据值列出列表”。

谢谢

【问题讨论】:

  • 您希望得到 4 个列表,还是只得到第一个或最后一个?
  • @kubatucka 我想得到最后一个代码块中显示的整个列表列表。
  • 到目前为止你尝试了什么?

标签: python list dictionary recursion nested


【解决方案1】:

我只是为此花了太多时间:

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

【讨论】:

  • 很抱歉拖了这么久,非常感谢,我真的很高兴!
【解决方案2】:

flat 展平输入数组
walk 递归遍历树并解包值

生成与提取的值数量相同长度的数组的最终列表理解
每个数组元素都是一个数组,其中包含来自 l (l[i:i+1]) 的 x 个单值数组与 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))])

【讨论】:

    猜你喜欢
    • 2020-10-22
    • 2021-09-15
    • 1970-01-01
    • 1970-01-01
    • 2021-11-20
    • 2021-04-19
    • 2018-01-16
    • 1970-01-01
    相关资源
    最近更新 更多