gpt4 book ai didi

python - 遍历树状结构

转载 作者:太空宇宙 更新时间:2023-11-04 01:32:43 25 4
gpt4 key购买 nike

我有这种结构:

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

最佳答案

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

然后我在 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com