我有一个类似以下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
,然后追加n
b(如果没有和,则追加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 True
和if 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]