依次折叠数组,直到包含可选的正负值



这里的问题是,如果数组中所有相邻的数字具有相同的符号,则将它们相加。所以我一开始用if循环在它上面运行一个循环。代码如下:

a=[-2,1,-3,4,-1,2,1,-5,4]
for i in range(len(a)):
if a[i]*a[i+1] >= 0:
a[i]=a[i]+a[i+1]
a.pop(i+1)
print(a)

显示索引超出范围错误。我推测这是由于列表的长度由于最后的pop而更新,因此索引可能超出范围。因此,我尝试像下面这样使用while循环:

a=[-2,1,-3,4,-1,2,1,-5,4]
lena,i= len(a),0
while i <= lena:
if a[i]*a[i+1] >= 0:
a[i]=a[i]+a[i+1]
a.pop(i+1)
lena=len(a)
i=+1
print(a)

在这里,循环花费了太多时间,我不得不手动停止程序。我相信它进入了无限循环。我不明白发生了什么事。我的伪代码很简单,如果i和i=1的乘积是>=0,用i+ (i+1)元素替换i元素,然后弹出i+1元素。请澄清错误,使代码工作。如果有更好的方法可能使用列表切片或任何其他方法,请告诉我。

解决方案:只要稍微调整一下索引,就能得到这个

a=[-2,1,-3,4,-1,2,1,-5,4]
lena,i= len(a)-1,1
while i <= lena:
if a[i]*a[i-1] >= 0:
a[i-1]=a[i]+a[i-1]
a.pop(i)
i-=1
lena=len(a)-1
i+=1
print(a)

这个工作到现在为止。请让我知道,如果有例子,它打破了。

我认为与其这样做,不如在你正在改变的列表上迭代,为什么不创建一个新的列表并使用那个列表呢?像这样:

a = [-2,1,3,4,-1,2,1,-5,-4]
b = [a[0]]
j = 0
for i in range(1,len(a)):
if (b[j]<0 and a[i]<0) or (b[j]>0 and a[i]>0):
b[j]+=a[i]
else:
b.append(a[i])
j+=1
print(b)

输出:

[-2,8,-1,3,-9]

而且,这个解决方案没有索引错误的问题,因为我们从来没有尝试一次访问列表的两个索引。

最新更新