在 Python 中的 for 循环语句中创建一个循环
Make a loop within for loop statement in Python
我有一个名为 vbn
的初始 list
。我正在考虑在列表中的每个 0
之后添加 0
的函数。
所以vbn = [1,0,2,3,0,4,5,0]
变成vbn = [1,0,0,2,3,0,0,4,5,0,0]
.
我使用了 for
循环和 .insert()
方法,得到了下面的结果。
vbn = [1,0,2,3,0,4,5,0]
s = 0
for i,j in enumerate(vbn[s:]):
if j == 0:
vbn.insert(i+1,0)
s += i+2
print(vbn)
输出:
[1, 0, 0, 2, 3, 0, 0, 4, 0, 5, 0]
根据我在代码中的理解,for
循环语句中的 s
完全不受迭代的影响。 s
循环内的变化如预期的那样。
谁能解释一下这是为什么?以及我该如何解决这个问题。
提前致谢!
您的问题是您插入的索引在第一次插入后不再有效,因为您增加了列表的大小。如果您更改代码以插入 x
而不是 0
,并在循环的每次迭代中打印 vbn
,您可以看到发生了什么:
vbn = [1,0,2,3,0,4,5,0]
s = 0
for i,j in enumerate(vbn[s:]):
if j == 0:
vbn.insert(i+1,'x')
s += i+2
print(vbn)
输出:
[1, 0, 2, 3, 0, 4, 5, 0]
[1, 0, 'x', 2, 3, 0, 4, 5, 0]
[1, 0, 'x', 2, 3, 0, 4, 5, 0]
[1, 0, 'x', 2, 3, 0, 4, 5, 0]
[1, 0, 'x', 2, 3, 'x', 0, 4, 5, 0]
[1, 0, 'x', 2, 3, 'x', 0, 4, 5, 0]
[1, 0, 'x', 2, 3, 'x', 0, 4, 5, 0]
[1, 0, 'x', 2, 3, 'x', 0, 4, 'x', 5, 0]
如您所见,即使是第二次插入也出现在错误的位置。您可以通过向插入点添加偏移量并在每次插入时增加该偏移量来解决此问题:
vbn = [1,0,2,3,0,4,5,0]
s = 0
o = 1
for i,j in enumerate(vbn[s:]):
if j == 0:
vbn.insert(i+o,'x')
s += i+2
o += 1
print(vbn)
输出(在这种情况下,您可以看到 x
被插入到您期望的位置):
[1, 0, 2, 3, 0, 4, 5, 0]
[1, 0, 'x', 2, 3, 0, 4, 5, 0]
[1, 0, 'x', 2, 3, 0, 4, 5, 0]
[1, 0, 'x', 2, 3, 0, 4, 5, 0]
[1, 0, 'x', 2, 3, 0, 'x', 4, 5, 0]
[1, 0, 'x', 2, 3, 0, 'x', 4, 5, 0]
[1, 0, 'x', 2, 3, 0, 'x', 4, 5, 0]
[1, 0, 'x', 2, 3, 0, 'x', 4, 5, 0, 'x']
只需将 x
改回 0
即可获得您想要的结果。请注意,我不确定 s += i+2
代码的用途;我假设您在循环后使用它。
如果您不想迭代多个值,另一种方法是在循环中创建一个新数组:
vbn = [1,0,2,3,0,4,5,0]
new = []
for i in vbn:
if i == 0:
new += [i, 0]
else:
new += [i]
print(new)
您可以尝试新建一个列表,将vbn中的元素(非零数或两个零)插入到新列表中。
vbn = [1,0,2,3,0,4,5,0]
newlist = []
for i in vbn:
if i == 0:
newlist.insert(len(newlist),i)
newlist.insert(len(newlist),0)
else:
newlist.insert(len(newlist),i)
print (newlist)
显示结果为:
[1, 0, 0, 2, 3, 0, 0, 4, 5, 0, 0]
虽然,我想不通循环中的s不迭代的原因;我虽然注意到代码中的另一个问题,即每次将 s 的值设置为 s+(i+2) 例如 0+(1+2),另一次它的值更改为 3+(i+2) 代替 0 +(i+2)
虽然我有一个替代解决方案来解决你的问题,即
vbn = [1,0,2,3,0,4,5,0]
s = 0
arr = []*10 #list to store no. of positions we need to add 0
for i,j in enumerate(vbn):
if j == 0:
arr.append(i)
m=0 #variable to keep count of number of times the list is extended before the current one
for k in arr:
k+=m #since, when we add zero to the list the current positions of elements changes
vbn.insert(k+1,0)
m+=1
print(vbn)
我有一个名为 vbn
的初始 list
。我正在考虑在列表中的每个 0
之后添加 0
的函数。
所以vbn = [1,0,2,3,0,4,5,0]
变成vbn = [1,0,0,2,3,0,0,4,5,0,0]
.
我使用了 for
循环和 .insert()
方法,得到了下面的结果。
vbn = [1,0,2,3,0,4,5,0]
s = 0
for i,j in enumerate(vbn[s:]):
if j == 0:
vbn.insert(i+1,0)
s += i+2
print(vbn)
输出:
[1, 0, 0, 2, 3, 0, 0, 4, 0, 5, 0]
根据我在代码中的理解,for
循环语句中的 s
完全不受迭代的影响。 s
循环内的变化如预期的那样。
谁能解释一下这是为什么?以及我该如何解决这个问题。
提前致谢!
您的问题是您插入的索引在第一次插入后不再有效,因为您增加了列表的大小。如果您更改代码以插入 x
而不是 0
,并在循环的每次迭代中打印 vbn
,您可以看到发生了什么:
vbn = [1,0,2,3,0,4,5,0]
s = 0
for i,j in enumerate(vbn[s:]):
if j == 0:
vbn.insert(i+1,'x')
s += i+2
print(vbn)
输出:
[1, 0, 2, 3, 0, 4, 5, 0]
[1, 0, 'x', 2, 3, 0, 4, 5, 0]
[1, 0, 'x', 2, 3, 0, 4, 5, 0]
[1, 0, 'x', 2, 3, 0, 4, 5, 0]
[1, 0, 'x', 2, 3, 'x', 0, 4, 5, 0]
[1, 0, 'x', 2, 3, 'x', 0, 4, 5, 0]
[1, 0, 'x', 2, 3, 'x', 0, 4, 5, 0]
[1, 0, 'x', 2, 3, 'x', 0, 4, 'x', 5, 0]
如您所见,即使是第二次插入也出现在错误的位置。您可以通过向插入点添加偏移量并在每次插入时增加该偏移量来解决此问题:
vbn = [1,0,2,3,0,4,5,0]
s = 0
o = 1
for i,j in enumerate(vbn[s:]):
if j == 0:
vbn.insert(i+o,'x')
s += i+2
o += 1
print(vbn)
输出(在这种情况下,您可以看到 x
被插入到您期望的位置):
[1, 0, 2, 3, 0, 4, 5, 0]
[1, 0, 'x', 2, 3, 0, 4, 5, 0]
[1, 0, 'x', 2, 3, 0, 4, 5, 0]
[1, 0, 'x', 2, 3, 0, 4, 5, 0]
[1, 0, 'x', 2, 3, 0, 'x', 4, 5, 0]
[1, 0, 'x', 2, 3, 0, 'x', 4, 5, 0]
[1, 0, 'x', 2, 3, 0, 'x', 4, 5, 0]
[1, 0, 'x', 2, 3, 0, 'x', 4, 5, 0, 'x']
只需将 x
改回 0
即可获得您想要的结果。请注意,我不确定 s += i+2
代码的用途;我假设您在循环后使用它。
如果您不想迭代多个值,另一种方法是在循环中创建一个新数组:
vbn = [1,0,2,3,0,4,5,0]
new = []
for i in vbn:
if i == 0:
new += [i, 0]
else:
new += [i]
print(new)
您可以尝试新建一个列表,将vbn中的元素(非零数或两个零)插入到新列表中。
vbn = [1,0,2,3,0,4,5,0]
newlist = []
for i in vbn:
if i == 0:
newlist.insert(len(newlist),i)
newlist.insert(len(newlist),0)
else:
newlist.insert(len(newlist),i)
print (newlist)
显示结果为:
[1, 0, 0, 2, 3, 0, 0, 4, 5, 0, 0]
虽然,我想不通循环中的s不迭代的原因;我虽然注意到代码中的另一个问题,即每次将 s 的值设置为 s+(i+2) 例如 0+(1+2),另一次它的值更改为 3+(i+2) 代替 0 +(i+2)
虽然我有一个替代解决方案来解决你的问题,即
vbn = [1,0,2,3,0,4,5,0]
s = 0
arr = []*10 #list to store no. of positions we need to add 0
for i,j in enumerate(vbn):
if j == 0:
arr.append(i)
m=0 #variable to keep count of number of times the list is extended before the current one
for k in arr:
k+=m #since, when we add zero to the list the current positions of elements changes
vbn.insert(k+1,0)
m+=1
print(vbn)