如何用python将几个列表转换成树形结构?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何用python将几个列表转换成树形结构?相关的知识,希望对你有一定的参考价值。

我把桌面文件的路径遍历了下来,形成了几个列表,每个列表是由文件的各级目录(字符串形式)组成的,现在我想把这些列表重新组合成树的形式,请问该怎么做呢

参考技术A

不要费那个劲了,直接用pathlib

如何用python剥离元组列表?

【中文标题】如何用python剥离元组列表?【英文标题】:How to strip a list of tuple with python? 【发布时间】:2010-12-05 21:55:10 【问题描述】:

对于每种情况,我都有一个带有一些标志的数组。 为了使用在 HTML 中打印数组并使用 colspan,我需要将其转换为:

['serve': False, 'open': False, 'serve': False, 'open': False, 'serve': False, 'open': False, 'serve': False, 'open': False, 'serve': False, 'open': False, 'serve': False, 'open': False, 'serve': False, 'open': False, 'serve': False, 'open': False, 'serve': False, 'open': False, 'serve': False, 'open': False, 'serve': False, 'open': False, 'serve': False, 'open': False, 'serve': True, 'open': True, 'serve': True, 'open': True, 'serve': True, 'open': True, 'serve': True, 'open': True, 'serve': True, 'open': True, 'serve': True, 'open': True, 'serve': True, 'open': True, 'serve': True, 'open': True, 'serve': True, 'open': True, 'serve': True, 'open': True, 'serve': True, 'open': True, 'serve': True, 'open': True, 'serve': True, 'open': True, 'serve': True, 'open': True, 'serve': True, 'open': True, 'serve': True, 'open': True, 'serve': True, 'open': True, 'serve': True, 'open': True, 'serve': True, 'open': True, 'serve': True, 'open': True, 'serve': True, 'open': True, 'serve': True, 'open': True, 'serve': True, 'open': True, 'serve': True, 'open': True, 'serve': True, 'open': True, 'serve': True, 'open': True, 'serve': True, 'open': True, 'serve': True, 'open': True, 'serve': True, 'open': True, 'serve': True, 'open': True, 'serve': True, 'open': True, 'serve': True, 'open': True, 'serve': True, 'open': True, 'serve': True, 'open': True, 'serve': True, 'open': True, 'serve': True, 'open': True, 'serve': True, 'open': True, 'serve': True, 'open': True, 'serve': True, 'open': True, 'serve': True, 'open': True, 'serve': True, 'open': True, 'serve': True, 'open': True, 'serve': True, 'open': True, 'serve': True, 'open': True, 'serve': True, 'open': True, 'serve': True, 'open': True, 'serve': True, 'open': True, 'serve': True, 'open': True, 'serve': True, 'open': True, 'serve': True, 'open': True, 'serve': True, 'open': True, 'serve': True, 'open': True, 'serve': False, 'open': True, 'serve': False, 'open': True, 'serve': False, 'open': True, 'serve': False, 'open': True, 'serve': False, 'open': True, 'serve': False, 'open': True, 'serve': False, 'open': True, 'serve': False, 'open': True, 'serve': False, 'open': False, 'serve': False, 'open': False, 'serve': False, 'open': False, 'serve': False, 'open': False, 'serve': False, 'open': False, 'serve': False, 'open': False, 'serve': False, 'open': False, 'serve': False, 'open': False, 'serve': False, 'open': False, 'serve': False, 'open': False, 'serve': False, 'open': False, 'serve': False, 'open': False, 'serve': False, 'open': False, 'serve': False, 'open': False, 'serve': False, 'open': False, 'serve': False, 'open': False, 'serve': False, 'open': False, 'serve': False, 'open': False, 'serve': False, 'open': False, 'serve': False, 'open': False, 'serve': False, 'open': False, 'serve': False, 'open': False, 'serve': False, 'open': False, 'serve': False, 'open': False]

在此为打开标志:

['colspan': 12, 'open': False, 'colspan': 60, 'open': True, 'colspan': 24, 'open': False]

另一个生成发球。

如何使用 Python 以最聪明的方式做到这一点?

我可以一一数一数,但这似乎不是个好主意。

【问题讨论】:

您的问题还不清楚。此外,这些 colspan 值是 freaky 这个 colspan 值用于这个简单的例子。 colspan 值是具有相同标志的连续案例的数量。 【参考方案1】:
def cluster(dicts, key):
    current_value = None
    current_span = 0
    result = []

    for d in dicts:
        value = d[key]
        if current_value is None:
            current_value = value
        elif current_value != value:
            result.append('colspan': current_span, key: current_value)
            current_value = value
            current_span = 0
        current_span += 1

    result.append('colspan': current_span, key: current_value)
    return result

by_open = cluster(data, 'open')
by_serve = cluster(data, 'serve')

第二个版本,灵感来自 Denis 的回答和他对 itertools.groupby 的使用:

import itertools
import operator

def make_spans(data, key):
    groups = itertools.groupby(data, operator.itemgetter(key))
    return ['colspan': len(list(items)), key: value for value, items in groups]

【讨论】:

colspan 每次都应该重新启动。这个函数给我 ['colspan': 12, 'open': False, 'colspan': 72, 'open': True, 'colspan': 96, 'open': False] 我的代码中缺少一行,我在几分钟前更正了 (current_span = 0)。它现在应该可以按预期工作。请原谅我的问题,但你知道如何编程,对吧?我的意思是,代码只是让您入门的示例,而不是生产就绪代码。如果您了解代码在做什么,那么发现您描述的错误应该很容易! 是的,我自己也修好了 :)【参考方案2】:

这个不清楚你需要什么,但希望下面的例子对你有所帮助:

>>> groupped = itertools.groupby(your_list, operator.itemgetter('open'))
>>> ['colspan': len(list(group)), 'open': open for open, group in groupped]
['colspan': 12, 'open': False, 'colspan': 60, 'open': True, 'colspan': 78, 'open': False]
>>> groupped = itertools.groupby(your_list)
>>> [dict(d, colspan=len(list(group))) for d, group in groupped]
['serve': False, 'open': False, 'colspan': 12, 'serve': True, 'open': True, 'colspan': 52, 'serve': False, 'open': True, 'colspan': 8, 'serve': False, 'open': False, 'colspan': 78]

【讨论】:

不知道为什么最后一个colspan没有预期值。 好吧,我知道……我的示例得到了 150 个案例而不是 96 个……当您知道如何使用 Python 时,它是如此强大。谢谢。 +1 包括电池!使用itertools.groupby 是要走的路! 如果我想保留一个我知道对所有组相同的信息,我该怎么办?例如:['colspan': 12, 'open': False, 'colspan': 60, 'open': True, 'schedule_id':1, 'colspan': 78, 'open': False ]

以上是关于如何用python将几个列表转换成树形结构?的主要内容,如果未能解决你的问题,请参考以下文章

如何用java无限级树形结构的构建

如何用js实现select下拉框里是树形结构,可复选,select框中传复选所有值?如下图所示。

如何用java与jsp实现树形结构

如何用Java拼接JSON方式遍历整个树形节点

使用js将后台返回的数据转换成树形结构

JavaScript实现扁平数组结构与JSON树形结构相互转换递归reducecontinuepushconcatfor of