在列表中的每个偶数后添加0

时间:2017-05-25 01:58:54

标签: python

我试图在每个偶数后添加一个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]

如何实现正确的清单?

3 个答案:

答案 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)