我正在使用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)
一些问题:
我无法在我的真实代码中为每个results
步骤检查j
的值,因为results[i]
是模型类,并且对{{1 }}同时进行(这就是示例中double for循环的原因)。
我认为该代码可以正常工作,但是对于较大的列表和更复杂的计算可能会很耗时。例如,如果我将列表更改为results[i]
,则必须包含更多的for循环。
我可以在第二个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
重新开始计算。
答案 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)