循环并处理列表中的项目,重新循环直到所有项目都已处理完毕

时间:2011-08-30 03:35:26

标签: python list tree

我发现类似但不完全相同的问题7423714081217有很好的答案,但还没有解决我的问题。

我正在尝试在循环中处理列表中的项目,并且如果它没有满足条件,则重新循环列表中剩余的内容。对于列表中的所有项,条件最终将满足为True,但不一定是“已知”迭代。它让我想起在某种程度上构建一棵树,因为列表中的某些项目必须在其他项目之前处理,但其他项目可能会事先循环。

我的第一直觉是创建一个递归函数并编辑列表的切片副本。但是我运气不好〜

我最初不会知道它需要多少次传递,但它永远不会比列表中的元素更多传递...只是由于至少一个元素的性质总是满足条件为True

理想情况下......结果将类似于以下内容

 # initial list
myList = ['it1', 'test', 'blah', 10]
newList = []

# first pass
newList = ['test']

# 2nd pass
newList = ['test', 'blah', 10]

# 3rd pass 
newList = ['test', 'blah', 10, 'it1']

3 个答案:

答案 0 :(得分:4)

current = ['it1', 'test', 'blah', 10]
results = []
while current:
    remaining = []
    for item in current:
        (results if meets_conditional(item) else remaining).append(item)
    current = remaining

答案 1 :(得分:1)

这样的事情怎么样(只是构成一个愚蠢的条件,所以我可以测试它):

import random

myList = ['it1', 'test', 'blah', 10]
newList = []

def someCondition(var):
    return random.randrange(0,2) == 0

def test():

    while len(myList) > 0:
        pos = 0
        while pos < len(myList):
            if someCondition(myList[pos]):  # with someCondition being a function here
                newList.append(myList.pop(pos))
            else:
                pos += 1

if __name__ == '__main__':
    test()
    print(myList)
    print(newList)

[结果:]

[]
['it1', 10, 'blah', 'test']

答案 2 :(得分:0)

蛮力方法是创建一个临时的布尔列表,其大小与原始列表在任何地方初始化为False的大小相同。

在每次传递中,只要原始列表的索引i处的项满足条件,就使用False更新索引i的临时数组中的值。

在每个后续传递中,仅查看相应索引为False的值。当所有值都变为True时停止。

Grr,想一想,保留符合条件的set个索引。是的,集合比布尔数组好。