我发现类似但不完全相同的问题742371和4081217有很好的答案,但还没有解决我的问题。
我正在尝试在循环中处理列表中的项目,并且如果它没有满足条件,则重新循环列表中剩余的内容。对于列表中的所有项,条件最终将满足为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']
答案 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
个索引。是的,集合比布尔数组好。