python - 循环树状结构

标签 python tree iteration generator

我有这样的结构:

[
    array([ 0. ,  4.5,  9. ]),
    [
        array([ 100.,  120.,  140.]),
        [
            array([ 1000.,  1100.,  1200.]), 
            array([ 1200.,  1300.,  1400.])
        ],
        array([ 150.,  170.,  190.]),
        [
            array([ 1500.,  1600.,  1700.]), 
            array([ 1700.,  1800.])
        ]
    ]
]

(其中 arraynumpy.array)

如何编写一个生成器来给我:

(0, 4.5), (100, 120), (1000, 1100)
(0, 4.5), (100, 120), (1100, 1200)
(0, 4.5), (120, 140), (1200, 1300)
(0, 4.5), (120, 140), (1300, 1400)
(4.5, 9), (150, 170), (1500, 1600)
(4.5, 9), (150, 170), (1600, 1700)
(4.5, 9), (170, 190), (1700, 1800)

到目前为止,我唯一拥有的是:

def loop_bin(bins):
    for i in range(len(bins)-1):
        yield [bins[i], bins[i+1]]

最佳答案

根据您的情况,我将其分解为几种不同类型的迭代:重叠配对(以及常规迭代)。

然后,我在 dopair 中递归遍历您的树结构,它会分析类型来决定如何迭代它所看到的数据。该决定基于我们是处理节点(包含子树)还是叶子(数组)。

generator 启动这一切。 izip 允许我们同时迭代两个生成器。

from itertools import izip

class array(list):
    pass

arr = [
    array([ 0. ,  4.5,  9. ]),
    [
        array([100.,  120.,  140.]),
        [
            array([ 1000.,  1100.,  1200.]), 
            array([ 1200.,  1300.,  1400.])
        ],
        array([ 150.,  170.,  190.]),
        [
            array([ 1500.,  1600.,  1700.]), 
            array([ 1700.,  1800.])
        ]
    ]
]

# overlap(structure) -> [st, tr, ru, uc, ct, tu, ur, re]
def overlap(structure):
    for i in range(len(structure)-1):
        yield (structure[i],structure[i+1])

# paired(structure) -> [st, ru, ct, ur]
def paired(structure):
    for i in range(0,len(structure)-1,2):
        yield (structure[i],structure[i+1])

def dopair(first,second):
    if all(isinstance(x,array) for x in second): 
        for pa,ir in izip(overlap(first),second):
            for item in overlap(ir):
                yield pa, item
    else:
        for pa,(i,r) in izip(overlap(first),paired(second)):
            for item in dopair(i,r):
                yield (pa,) + item

def generator(arr):
    for pa,ir in paired(arr):
        for x in dopair(pa,ir):
            yield x

for x in generator(arr):
    print x

关于python - 循环树状结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12674537/

相关文章:

MySQL:连接 HABTM 表,然后用结果计数更新列

python - 从 Pandas Dataframe 列中提取字符串形式的 JSON 对象列表

Python登录网页获取session保护页面内容

Python 3 运算符.div?

angular - 尝试使按钮折叠/展开 Angular Material 嵌套树时出错

java - 右侧 GWT 树菜单项中的图标。

java - 关于迭代图像中每个像素的简单问题

python - ndb.StructuredProperty 中的自动字段值

jenkins - Jenkins远程API-是否可以在不知道深度的情况下使用Jenkins树查询api检索完整的作业树?

python - 如何在迭代时从列表中删除项目?