求和一个数字列表,直到找到一个数字0



我有一个类似以下data = [1, 0, 0, 0, 1, 1, 1, 0, 2, 3, 1, 0, 0, 1, 1, 1, 0]的数据列表,我想把列表的元素加起来如下:[1, 0, 0, 0, 0, 0, 3, 0, 0, 0, 6, 0, 0, 0, 0, 3, 0],其中前一个元素是值0,而0以外的最后一个元素则是前一个数量的元素的值的结果。

我尝试过以下代码,如果我进行跟踪,看起来是可以完成的,但当我运行它时,它不会显示结果,但它仍然在循环中,不会停止。

我试过了:

data = [1, 0, 0, 0, 1, 1, 1, 0]
k = len(data)-1
while True:
print(k)
if(data[k-1] == 0):
continue
elif(data[k] == 0):
print("h")
continue
elif(data[k-1] != 0):
data[k] = data[k] + data[k-1]
data[k-1] = 0
k = k-1
if(k == 0):
break
print(data)
  • 遍历列表,每次只添加一个非零数字并将零附加到列表中
  • 当出现一个0时,只需追加和并使和为0
  • 如果最后一个元素为0,则在最后一个数字或各自的最后一个数字
  • 只需移除第一个零并返回列表

data = [1, 0, 0, 0, 1, 1, 1, 0, 2, 3, 1, 0, 0, 1, 1, 1, 0]
def calc(data):
sum = 0
new = []
for i in range(len(data)):
if data[i] == 0:
new.append(sum)
if i == len(data) - 1:
new.append(0)
sum = 0
else:
sum = sum = sum + data[i]
new.append(0)
if i == len(data) - 1:
new.append(sum)
if new[0] == 0:
del new[0]
return new

这里有一个非常简单的实现。我认为这是不言自明的。迭代列表中的每个项n,如果n为零,则有两个选项a(如果有上一个和x,则追加x,然后追加nb(如果没有和,则追加0。如果n与零不同,则将其求和为x

data = [1, 0, 0, 0, 1, 1, 1, 0, 2, 3, 1, 0, 0, 1, 1, 1, 0]
x = 0
r = []
for n in data:
if n == 0:
if x:
r.append(x)
x = 0
r.append(n)
else:
x += n

print(r)
[1, 0, 0, 0, 3, 0, 6, 0, 0, 3, 0]

遍历列表,如果当前元素和下一个元素不为0,则添加到临时变量并将当前元素设为0,当下一个元件为零时,将值设为当前元素。由于,代码使用当前元素检查下一个元素,因此,遍历倒数第二个元素并分别检查最后一个元素。

def arrange_list(arr):
value = 0
for x in range(len(arr)-1):
if arr[x] != 0:
value += arr[x]
else:
value = 0
if arr[x+1] != 0:
arr[x] = 0
else:
arr[x] = value
value = 0
if value !=0:
arr[-1] = value + arr[-1]
return arr

正如Comments中提到的,由于所有的continues,您将进入一个无限循环。你需要确保k=k-1线恰好避免了无限循环。

第二,为什么while Trueif k==0: break将其更改为while k>=0

不管怎样,你的代码都不会工作,因为它会对零后面的元素产生问题。

此代码将起作用:

ans = []
tmp = 0
data = [1, 0, 0, 0, 1, 1, 1, 0]
for curr in data:
if curr != 0:
tmp += curr
elif tmp == 0:
ans.append(tmp)
else:
ans.append(tmp)
ans.append(0)
tmp = 0
print(ans)

您只需要从1开始k的值并设置elif(data[k] != 0):。但是,它将修改您的原始列表。

data=[1, 0, 0, 0, 1, 1, 1, 0, 2, 3, 1, 0, 0, 1, 1, 1, 0]
k = 1
while True:

if(data[k-1] == 0):
pass
elif(data[k] == 0):
pass
elif(data[k] != 0):
data[k] = data[k] + data[k-1]
print(data[k])
data[k-1] = 0
k = k+1
if(k == len(data)):
break
print(data)

输出

3
5
6
2
3
[1, 0, 0, 0, 0, 0, 3, 0, 0, 0, 6, 0, 0, 0, 0, 3, 0]
  • 在使用continue时,您的代码正在运行到无限循环语句,它将再次从头开始循环
  • 在您的案例中,data[k]为零,因此第一个elif语句始终为true并且continue语句正在执行
  • 由于上述原因,代码k=k-1行总是不可访问的,并且在您的情况下,k值总是7。所以while循环是无限运行的

下面是一个建议的代码示例,它可以满足您的用例。

data = [1, 0, 0, 0, 1, 1, 1, 0, 2, 3, 1, 0, 0, 1, 1, 1, 0]
k = len(data)-1
for i in range(0,k):
if(data[i]==0):
continue
if(data[i]!=0 and data[i+1]!=0):
data[i+1]=data[i]+data[i+1]
data[i]=0
print(data)

为什么不这样做:

def convert(A):
B = [0] * len(A)
partial_sum = 0
for i in range(len(A) - 1):
partial_sum += A[i]
if A[i + 1] == 0:
B[i] = partial_sum
partial_sum = 0

if A[-1] != 0:
B[-1] = partial_sum + A[-1]

return B

与前面的答案相反,这实际上保留了原始数组的长度。

您可以定义一个通用可重用方法,该方法在某些情况下可用。

在这里,它返回一个生成器:

def slice_when(predicate, iterable):
i, x, size = 0, 0, len(iterable)
while i < size-1:
if predicate(iterable[i], iterable[i+1]):
yield iterable[x:i+1]
x = i + 1
i += 1
yield iterable[x:size]

用法示例

一旦你有了这个方法,你就可以这样使用它:

data = [1, 0, 0, 0, 1, 1, 1, 0, 2, 3, 1, 0, 0, 1, 1, 1, 0]
test_method = slice_when(lambda _, y: y==0, data)
list(test_method)
#=> [[1], [0], [0], [0, 1, 1, 1], [0, 2, 3, 1], [0], [0, 1, 1, 1], [0]]

您的案例

以下是如何应用它来解决您的问题:

res = []
for e in slice_when(lambda _, y: y==0, data):
res += [0]*(len(e)-1) + [sum(e)]

res
#=> [1, 0, 0, 0, 0, 0, 3, 0, 0, 0, 6, 0, 0, 0, 0, 3, 0]

最新更新