我试图在每个偶数后添加一个0,每次运行代码时它会无限地打印i的值,每次都为0。
到目前为止我已经尝试过了:
def linear_list (n):
x = []
for y in range (1, n+1):
x.append (y)
return x
n = int (input ("Enter the lenght of the list: "))
alist = linear_list (n)
for i in alist:
print (i)
if i % 2 == 0:
alist.append(0)
print (alist)
但对于i >= 2
我的代码打印无限零:
Enter the lenght of the list: 5
0
0
0
0
...
预期产出:
[1, 2, 0, 3, 4, 0, 5, 6, 0, 7, 8, 0, 9, 10, 0]
如何实现正确的清单?
答案 0 :(得分:2)
让它发挥作用,使其正确,加快速度
这里使其成功部分。
您正在修改列表并同时迭代它。
尝试:
otherlist = []
for i in alist:
print (i)
otherlist.append(i)
if i % 2 == 0:
otherlist.append(0)
print (otherlist)
答案 1 :(得分:0)
每次添加alist
时,你都会增加for i, v in enumerate(alist):
print (v)
if v % 2 == 0:
alist[i] = v * 10 # assuming it's a number, use v + "0" if its a string
长度,并且由于你循环遍历它,你永远不会退出循环 - 列表永远不会结束。您不想更改列表,但要更改其中的值,因此请枚举它:
**** SOLVER STATUS 1 Normal Completion
**** MODEL STATUS 19 Infeasible - No Solution
**** OBJECTIVE VALUE NA
答案 2 :(得分:0)
由for
循环创建的迭代器是与迭代列表中的单独对象。您的for
循环类似于while
循环,如
itr = iter(a)
while True:
try:
i = next(itr)
except StopIteration:
break
if i % 2 == 0:
a.append(0)
a.append
总是在列表的 end 中添加0,而不会影响迭代器的当前位置。由于0是偶数,一旦迭代器在启动循环时到达列表末尾的 ,它就会看到0,因此另一个0被添加到列表的末尾。它会继续读取下一个0并永久地添加另一个0,开启和打开。
从技术上讲,你可以做你想做的事,但这很棘手,很容易出错。 (我花了大约8次试图让这个例子正确。)诀窍是显式创建一个单独的迭代器,你可以在循环体中访问它,而不是让for
循环生成迭代器您。这允许你在列表中的当前值之后插入一个0,然后跳过新的0,这样你就不会在循环的下一次迭代中看到它。
如果可以避免,请不要这样做:创建一个在循环后替换旧列表的新列表要简单得多。
那说,随着节目:
a = range(10)
itr = enumerate(a) # A list of index, value pairs
for index, value in itr:
if value % 2 == 0:
i = index + 1
a[i:i] = [0] # Put a 0 after the current position
next(itr) # Skip over the 0 you just added
assert a == [0, 0, 1, 2, 0, 3, 4, 0, 5, 6, 0, 7, 8, 0, 9]
您可以通过将索引设置为1而不是0来缩短此位,在您需要之前有效地为每个索引预先添加1。
a = range(10)
itr = enumerate(a, start=1)
for i, value in itr:
if value % 2 == 0:
a[i:i] = [0]
next(itr)