问题描述
我有一个名为 list
的初始 vbn
。我正在考虑在列表中的每个 0
之后添加 0
的函数。
所以 vbn = [1,2,3,4,5,0]
变成 vbn = [1,0]
。
我使用了 for
循环和 .insert()
方法来执行此操作并获得以下结果。
vbn = [1,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]
根据我在代码中的理解,s
循环语句中的 for
完全不受迭代影响。不过循环中的 s
会按预期更改。
谁能解释一下这是为什么?以及我如何解决这个问题。
提前致谢!
解决方法
您的问题是您插入的索引在第一次插入后不再有效,因为您增加了列表的大小。如果您将代码更改为插入 x
而不是 0
,并在循环的每次迭代中打印 vbn
,您可以看到发生了什么:
vbn = [1,2,3,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]
[1,'x',0]
如您所见,即使是第二次插入也发生在错误的位置。您可以通过向插入点添加偏移量并在每次插入时增加该偏移量来解决此问题:
vbn = [1,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,'x']
只需将 x
改回 0
即可获得您想要的结果。请注意,我不确定 s += i+2
代码的用途;我假设你在循环后使用它。
如果您不想迭代多个值,另一种方法是在循环中创建一个新数组:
vbn = [1,0]
new = []
for i in vbn:
if i == 0:
new += [i,0]
else:
new += [i]
print(new)
,
您可以尝试创建一个新列表并将 vbn 中的元素(非零数字或两个零)插入到新列表中。
vbn = [1,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]
,
虽然,我无法弄清楚循环中的 s 没有迭代的原因;我虽然注意到代码中的另一个问题,即每次将 s 的值设置为 s+(i+2) 例如 0+(1+2),其他时候它的值更改为 3+(i+2) 代替 0 +(i+2)
虽然我有一个替代解决方案来解决您的问题,即
vbn = [1,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)