在Python中的for-loop语句中创建循环

2024-06-24 12:23:59 发布

您现在位置: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根本不受迭代的影响^不过,循环中的{}会按预期发生变化

有人能解释一下为什么会这样吗?以及我如何解决这个问题

提前谢谢


Tags: 方法函数代码in列表forif语句
3条回答

如果不想迭代多个值,另一种方法是在循环中创建一个新数组:

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)

您的问题是,您插入的索引在第一次插入后不再有效,因为您增加了列表的大小。如果将代码更改为插入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中的元素(非零数字或两个零)插入到新列表中

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]

相关问题 更多 >