2017-01-16 56 views
-2

我有一个任务,按照特定规则创建列表的列表。列表必须用具有特定颜色的根来表示具有根和分支的树。每个分支应表示为其子元素的列表(一个黑色分支生成3个白色; 1个白色分支生成2个黑色)。例如:root=['black'],第一分支[['white','white','white']],下一次迭代应该是[[[black,black],[black,black],[black,black]]]等等。创建列表的无限嵌套列表

这个无限列表应该存储在全局变量中。可能吗? 我的代码,它生成这样的列表只做预定数量的步骤。

root = ['b'] 
def change(root): 
    for index, item in enumerate(root): 
     if isinstance(item, list): 
      change(item) 
     elif item == 'b': 
      root[index] = ['w','w','w'] 
     elif item == 'w': 
      root[index] = ['b','b'] 
    return root 

for i in range(3): 
    tree=change(root) 
print(tree) 

如何可以生成无限列表?

+3

你不能产生一个实际的无限列表;因为这是一个有限的资源,所以永远不会有足够的内存。 –

+1

但是,除了内存以外,您可以嵌套列表的深度级别没有限制。 –

+0

@MartijnPieters也许他的意思是他需要编写一个程序来产生一个可能无限的列表,并遵循一定的模式。 – Tagc

回答

1

如果我理解您的要求, LY,这在内存中创建整个无限的树(但只需要有限的内存,因为它是指自己):

black = [] 
white = [black, black] 
black.append([white, white, white]) 

root = black # or white, if you prefer 

注意,“B”和“W”叶节点永远不会出现在树中,因为你永远无法实现他们。

+0

啊,我现在得到的是OP。虽然我不确定他从中得到什么效用(每个元素的每个元素和每个孩子都只会被表示为[[[...],[[...]]],[[[ ...]],[[...]]],[[...],[[...]]]]。尽管理解要求比+1更好。 – Tagc

0

在对你的问题的意见,我建议:

@MartijnPieters也许他[OP]表示他需要编写一个程序,产生遵循一定的模式列表的一个潜在的无限列表。

你回答说,这就是你想要什么,所以我在它有一个去 - 我张贴代码涉及到使用函数发生器,你可以用它来生成遵循模式的潜在的永无止境的序列你指定(如果我们假设无限的内存)。

不久前我看到an incredible solution由某人发布以生成coprime对序列。这是我第一次意识到“自我递归发生器”这个令人兴奋的概念。你可以用它们做一些非常棒的事情,比如generate the Kolakoski sequence

无论如何,我有一种直觉,我可以使用自递归生成器来解决您的问题。货品消息是我的代码有效。坏消息是,我不知道为什么我的代码工作。那就是:

from enum import Enum 


class Colour(Enum): 
    BLACK = 'black' 
    WHITE = 'white' 

def generate_tree(curr_colour = Colour.BLACK): 
    yield [curr_colour] 
    for sub_tree in generate_tree(Colour.WHITE if curr_colour == Colour.BLACK else Colour.BLACK): 
     if curr_colour == Colour.WHITE: 
      tree = [sub_tree, sub_tree] 
     else: 
      tree = [sub_tree, sub_tree, sub_tree] 

     yield tree 

if __name__ == '__main__': 
    generator = generate_tree() 
    for _ in range(3): 
     print(next(generator)) 

为n输出= 3

[<Colour.BLACK: 'black'>] 
[[<Colour.WHITE: 'white'>], [<Colour.WHITE: 'white'>], [<Colour.WHITE: 'white'>]] 
[[[<Colour.BLACK: 'black'>], [<Colour.BLACK: 'black'>]], [[<Colour.BLACK: 'black'>], [<Colour.BLACK: 'black'>]], [[<Colour.BLACK: 'black'>], [<Colour.BLACK: 'black'>]]] 

您可以使用下面的变体有一个程序,不断无限期产生的树,在每次迭代等待用户输入:

if __name__ == '__main__': 
    generator = generate_tree() 
    while True: 
     print(next(generator)) 
     input()