【问题标题】:loop and process items in list, reloop until all items have been processed循环并处理列表中的项目,重新循环直到所有项目都已处理
【发布时间】:2011-08-30 03:35:26
【问题描述】:

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

我正在尝试处理列表中的项目,同时它被循环,如果它没有满足条件,则重新循环列表中剩余的内容。对于列表中的所有项目,条件最终将满足为 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']

【问题讨论】:

    标签: python list tree


    【解决方案1】:
    current = ['it1', 'test', 'blah', 10]
    results = []
    while current:
        remaining = []
        for item in current:
            (results if meets_conditional(item) else remaining).append(item)
        current = remaining
    

    【讨论】:

    • 似乎进入了一个无限循环~ def meet_conditional(item): if type(item) is str: return True;否则:返回 False
    • 您说“对于列表中的所有项目,条件最终都会满足为真”——如果是这种情况,此方法将起作用。由于10 永远不是str,因此您的示例不符合该标准。另外,一般使用isinstance 而不是type
    • 只有当你关心它的继承时,在这种情况下我才不会〜但是,好的呼吁最终为真。卡尔解决了它。干杯
    【解决方案2】:

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

    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']
    

    【讨论】:

    • 每个 pop 都是 O(n),因此您可以使用类似 @Karl 的方法获得更好的时间复杂度。
    【解决方案3】:

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

    在每次遍历中,只要原始列表的索引i处的项目满足条件,就将索引i处的临时数组中的值更新为False。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-08-14
      • 2015-01-11
      • 2013-05-01
      • 2013-10-08
      • 1970-01-01
      • 1970-01-01
      • 2019-08-06
      • 2023-03-23
      相关资源
      最近更新 更多