如果条件为False,则重新启动循环并编辑原始列表

时间:2019-05-02 14:49:35

标签: python for-loop while-loop

我正在使用for循环对列表进行一些操作,当不满足if条件时,我需要删除该列表中的元素,然后再次执行该操作。

我看到过calculator(和here)示例,其中他们使用了while循环,但我无法使其适应我的问题。

这是我想做的事的一个例子

a = [[9,8,7], [6,5,3,4]] # different length sublists, elements are not repeated
results = [[] for i in range(len(a))]

for i in range(len(a)):   
    for j in range(len(a[i])):
        results[i].append(a[i][j]/4)
# see below for explanation for this step
    for j in range(len(a[i])):
        if results[i][j] <1:
            del a[i][j]
            print('element',j,'removed from sublist',i)
            break
        else:
            continue
# when there is an element that doesn't met the condition I want to remove 
# that element and restart the calculation for that step, in this case i=1 
# but this depends on the list

# The calculation is then done for the list with the element removed
# this is way I'm repeating the code below (which I want to avoid)

results = [[] for i in range(len(a))]
for i in range(len(a)):   
    for j in range(len(a[i])):
        results[i].append(a[i][j]/4)
    for j in range(len(a[i])):
        if results[i][j] <1:
            del a[i][j]
            print('element',j,'removed from sublist',i)
            break
        else:
            continue
print(results)

一些问题:

  1. 我无法在我的真实代码中为每个results步骤检查j的值,因为results[i]是模型类,并且对{{1 }}同时进行(这就是示例中double for循环的原因)。

  2. 我认为该代码可以正常工作,但是对于较大的列表和更复杂的计算可能会很耗时。例如,如果我将列表更改为results[i],则必须包含更多的for循环。

  3. 我可以在第二个a = [[9,8,7], [6,5,3,2,4]]循环中使用类似range(restart, len(a))的东西,但是第2点的问题仍然存在,它将新的结果附加到旧的结果上,例如for i而非results = [[2.25, 2.0, 1.75], [1.5, 1.25, 0.75, 1.0, 1.5, 1.25, 1.0]]

是否有更好的方法?也许有一个results = [[2.25, 2.0, 1.75], [1.5, 1.25, 1.0]]循环?如果没有其他方法,并且不必为包含更多元素的较大列表包括更多的while循环,我可以从i=0重新开始计算。

2 个答案:

答案 0 :(得分:0)

您重复了两次代码。

如果要将值1赋给变量i并“重新启动”,则使用while循环会更好。例如:

while i <= len(a):

       # your code
       # restar i value when you need it using:
       i = 1;

我不知道您何时要重新启动i的值,但是您可以在继续操作之前,在其他情况下尝试使用此值。

i = 1

答案 1 :(得分:0)

它可能不是很pythonic,但这对我有用。

a = [[9,8,7], [6,5,3,4]]
results = [[] for i in range(len(a))]

res=0
while res<1:  
    for i in range(len(a)):   
        for j in range(len(a[i])):
            results[i].append(a[i][j]/4)
        for j in range(len(results[i])):
            res = results[i][j]
            if res < 1:
                del a[i][j]
            print('element',j,'removed from sublist',i)
            res=10
print('new a =', a)

但是,如果子列表中有多个元素满足条件,则此方法将不起作用,因为索引将不同。在这种情况下,break可用于中断for循环并从更新后的列表重新开始。

a = [[9,3,7], [1,5,2,4]]
res=0
while res<1:  
    print(a)
    results = [[] for i in range(len(a))]
    for i in range(len(a)):   
        for j in range(len(a[i])):
            results[i].append(a[i][j]/4)
        for j in range(len(results[i])):
            print(i, j, results[i][j])
            res = results[i][j]
            if res < 1:
                del a[i][j]
                print('element',j,'removed from sublist',i)
                break
        if res < 1:
            print('restarting while loop')
            break
print('new a =', a)