无法在for循环中重置计数器

时间:2019-07-27 13:27:28

标签: python python-3.x for-loop iteration

我正在尝试以每2个重复的整数乘以2并替换重复项的方式来修改整数列表。这是一个例子:     a = [1, 1, 2, 3] = [2, 2 ,3] = [4 ,3]
    还:b = [2, 3, 3, 6 ,9] = [2 , 6 , 6, 9] = [2, 12 , 9]

我正在使用下面的代码来实现这一目标。不幸的是,每次我找到一个匹配项,我的索引都会跳过下一个匹配项。

user_input = [int(a) for a in input().split()]

for index, item in enumerate(user_input):
    while len(user_input)-2 >= index:
        if item == user_input[index + 1]:
            del user_input[index]
            del user_input[index]
            item += item
            user_input.insert(index,item)
        break

print(*user_input)

3 个答案:

答案 0 :(得分:4)

在Python中,请勿在遍历容器对象时修改容器对象。如果您知道自己在做什么,则会有一些例外,但是您当然不应该更改容器对象的大小。那就是您要尝试做的,这就是失败的原因。

相反,请使用其他方法。遍历列表,但构造一个新列表。根据需要修改该新列表。这是执行您想要的代码。这将建立一个名为new_list的新列表,并更改该列表中的最后一个项目或追加一个新项目。原始列表永远不会改变。

user_input = [int(a) for a in input().split()]

new_list = []
for item in user_input:
    while new_list and (item == new_list[-1]):
        new_list.pop()
        item *= 2
    new_list.append(item)

print(*new_list)

此代码传递了您给出的两个示例。它还通过示例[8, 4, 2, 1, 1, 7],其结果应为[16, 7]。我以前的版本没有通过最后一次测试,但是这个新版本通过了。

答案 1 :(得分:0)

检查这是否适用于Rory!

import copy
user_input = [1,1,2,3]
res = []
while res!=user_input:
    a = user_input.pop(0)
    if len(user_input)!=0
        b = user_input.pop(0)
        if a==b:
            user_input.insert(0,a+b)
        else:
            res.append(a)
            user_input.insert(0,b)
    else:
        res.append(a)
        user_input = copy.deepcopy(res)

答案 2 :(得分:0)

您可以使用itertools.groupby和递归:

检查相同的连续元素:

def same_consec(lst):
    return any(len(list(g)) > 1 for _, g in groupby(lst))

替换连续的相同元素:

def replace_consec(lst):
    if same_consec(lst):
        lst = [k * 2 if len(list(g)) > 1 else k for k, g in groupby(lst)]
        return replace_consec(lst)
    else:
        return lst

用法

>>> a = [8, 4, 2, 1, 1, 7] 
>>> replace_consec(a)
[16, 7]