通过仅提供"left()"和"right()"作为命令,使用光标通过嵌套列表手动导航?

nil*_*shi 5 python navigation cursor user-interaction nested-lists

尽管我在python中写道,但我认为抽象概念对我和其他人来说更有趣.如果你喜欢,那么伪代码请:)

我有一个列表,其中包含我的一个课程中的项目.让我们在这里用字符串和数字来做,这没关系.它嵌套到任何深度.(它实际上不是一个列表,而是一个基于列表的容器类.)

例如: [1,2,3,['a','b','c'] 4 ['d','e',[100,200,300]] 5,['a','b' ,'c'],6]

请注意,['a','b','c']实际上都是同一个容器.如果你改变一个,你改变另一个.可以编辑容器和项目,插入项目和最重要的容器可以多次使用.为了避免冗余,它不可能使列表变平(我认为!),因为你无法在一个容器中插入项目,它会自动出现在所有其他容器中.

问题:针对前端(刚刚与蟒蛇"CMD"命令行模块),我想通过这个结构与游标,它总是指向当前项目,以便它可以读取或编辑导航.光标可以左右(用户的观点),并且应该表现得像列表不是嵌套列表而是扁平列表.

对于人类而言,这非常容易.你只是假装在上面的这个列表中,子列表不存在,只是从左到右依次走.

例如,如果您在上面的列表中处于"3"的位置并向右移动,则将"a"作为下一项,然后是"b","c",然后是"4"等.或者如果您从右边开始"300"你接下来会得到"5".

向后:如果你从"6"左转,那么下一个是'c'.如果你从"5"左转到它的"300".

那么我原则上该如何做呢?我有一种方法,但它的错误,问题已经很长了,我担心大多数人都不会读它:(.我可以稍后发布.

PS即使它很难抗拒:这个问题的答案不是"你为什么要这样做,为什么要用这种方式组织你的数据,为什么不先把我的想法变得平淡无味" ?问题正是我在这里所描述的,没有别的.数据是由问题的本质构成的.

sen*_*rle 3

一种解决方案是存储当前索引和/或深度信息并使用它来遍历嵌套列表。但这似乎是一个需要进行大量复杂分叉的解决方案——测试列表末尾等等。相反,我想出了一个妥协方案。我没有将列表列表展平,而是创建了一个生成器,将索引的平面列表创建到列表列表中:

def enumerate_nested(nested, indices):
    for i, item in enumerate(nested):
        if isinstance(item, collections.Iterable) and not isinstance(item, basestring):
            for new_indices in enumerate_nested(item, indices + (i,)):
                yield new_indices
        else:
            yield indices + (i,)
Run Code Online (Sandbox Code Playgroud)

然后是一个简单的函数,根据索引元组从列表列表中提取最里面的项目:

def tuple_index(nested_list, index_tuple):
    for i in index_tuple:
        nested_list = nested_list[i]
    return nested_list
Run Code Online (Sandbox Code Playgroud)

现在您所要做的就是以您喜欢的任何方式遍历平面索引列表。

>>> indices = list(enumerate_nested(l, tuple()))
>>> print l
[1, 2, 3, ['a', 'b', 'c'], 4, ['d', 'e', [100, 200, 300]], 5, ['a', 'b', 'c'], 6]
>>> for i in indices:
...     print tuple_index(l, i),
... 
1 2 3 a b c 4 d e 100 200 300 5 a b c 6
Run Code Online (Sandbox Code Playgroud)

由于这个答案被我在评论中发布在 ideone 上的基于堆栈的解决方案所接受,并且由于最好不要使用外部 Pastebins 作为答案代码,因此请注意,这个答案还包含我的基于堆栈的解决方案。