我正在尝试以每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)
答案 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]