创建列表

时间:2017-01-16 19:24:00

标签: python python-3.x

我有一项任务是按照特定规则制作列表清单。 List必须表示具有根的树,并且具有特定颜色的根。每个分支应表示为其子元素的列表(一个黑色分支生成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)

如果可能,我如何生成无限列表?

2 个答案:

答案 0 :(得分:1)

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

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

root = black    # or white, if you prefer

请注意''和' w'叶子节点永远不会出现在树中,因为你永远无法实现它们。

答案 1 :(得分:0)

在你的问题评论中,我建议:

  

@MartijnPieters也许他[OP]意味着他需要编写一个产生一个潜在无限列表的程序,该列表遵循某种模式。

你回答说这就是你想要的,所以我去了它 - 我发布的代码涉及使用函数生成器,你可以使用它来生成一个可能永无止境的序列你指定的模式(如果我们假设无限的记忆)。

不久前,我看到有人发布an incredible solution来生成互质对的序列。这是我第一次意识到“自我递归发生器”的整个令人兴奋的概念。你可以用它们做一些非常棒的事情,比如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()