请问如何计算 Python 列表连续正数或连续负数的和?

2021-08-19 12:06:05 +08:00
 going

请问如何高效计算 Python 列表连续正数或连续负数的和?

案例:[1,3,5,-2,-1,3,5,2,-1,-3,-3]

期望结果:[9,-3,10,-7]

3663 次点击
所在节点    Python
41 条回复
unixeno
2021-08-19 12:08:26 +08:00
这个不是循环一遍就出来了吗
zzzain46
2021-08-19 12:24:11 +08:00
请学习 for 循环
nobody1234
2021-08-19 12:26:44 +08:00
维护好两个下标,遍历一次搞定
lizytalk
2021-08-19 12:37:51 +08:00
要说 pythonic 的话可以这样
x = [1,3,5,-2,-1,3,5,2,-1,-3,-3]
list(map(lambda item: sum(item[1]), groupby(x, key=lambda _: _ > 0)))
lizytalk
2021-08-19 12:38:34 +08:00
如果不需要 pythonic 的话还是 for 循环吧,遍历一遍就可以
ch2
2021-08-19 12:40:25 +08:00
nums=[1,3,5,-2,-1,3,5,2,-1,-3,-3]
upper=[]
lower=[]
result=[]
for num in nums:
if num>0:
if len(upper)==0:
if len(lower)>0:
result.append(sum(lower))
lower=[]
upper.append(num)
else:
if len(lower)==0:
if len(upper)>0:
result.append(sum(upper))
upper=[]
lower.append(num)
if len(upper) > 0:
result.append(sum(upper))
if len(lower) > 0:
result.append(sum(lower))
print(result)
kasusa
2021-08-19 12:41:47 +08:00
```
list1 = [1,3,5,-2,-1,3,5,2,-1,-3,-3] #原数据
list2 = [] #结果输出
a = list1[0] #计算从 2 开始

for index in range(1,len(list1)):
if list1[index] * list1[index - 1] < 0: #有换号,将结果添加到 list2,、把 a 归零
list2.append(a)
a = 0
a += list1[index]
else: #无换号,正常累加
a += list1[index]
list2.append(a) #将最后一个累加结果加入结果集

print(list2)
```

用到了数学中零点判定的知识。
kasusa
2021-08-19 12:42:35 +08:00
```
V2EX 不支持这个 markdown 语法吗?

```
kasusa
2021-08-19 12:44:46 +08:00
```html
是不是我的 markdown 语法有问题 >.>
```
Kilerd
2021-08-19 12:45:25 +08:00
作业请独立完成
kasusa
2021-08-19 12:47:10 +08:00
zmxnv123
2021-08-19 12:48:16 +08:00
@lizytalk 你这个不是连续的吧
msg7086
2021-08-19 13:08:59 +08:00
只懂 Ruby,写起来不难。
x = [1, 3, 5, -2, -1, 3, 5, 2, -1, -3, -3]
x.chunk(&:positive?).map(&:last).map(&:sum) #=> [9, -3, 10, -7]

Python 里如果有类似的方法的话照着改一下就行了吧。
huntagain2008
2021-08-19 13:13:25 +08:00
非程序员,看着文档学了 for 循环,不知道写的对不对。
``` python
a=[1,3,5,-2,-1,3,5,2,-1,-3,-3]
b=[]
for i in range(len(a)):
if i<len(a)-1:
if a[i]*a[i+1]>0:
a[i+1]=a[i]+a[i+1] # 比如 1+3 取 4 的结果放在下标 a[1]
else:
b+=[a[i]] # 遇到正负不同的,比如遇到-2 取 a[2]作为和
kasusa
2021-08-19 13:16:45 +08:00
感觉小题目还挺益智的。
不过 V2EX 显示代码真是难受。没有高亮、没有缩进。
huntagain2008
2021-08-19 13:17:06 +08:00
@huntagain2008
``` python

a=[1,3,5,-2,-1,3,5,2,-1,-3,-3]
b=[]
for i in range(len(a)):
if i<len(a)-1:
if a[i]*a[i+1]>0:
a[i+1]=a[i]+a[i+1] # 比如 1+3 取 4 的结果放在下标 a[1]
else:
b+=[a[i]] # 遇到正负不同的,比如遇到-2 取 a[2]作为和

```
huntagain2008
2021-08-19 13:36:09 +08:00
@huntagain2008 好吧,错了。
a=[-2,1,3,5,-2,-1,3,5,2,-1,-3,-3]经过这段代码变成了[-2, 1, 4, 9, -2, -3, 3, 8, 10, -1, -4, -7]
b 的值只有[-2, 9, -3, 10],后面的-12 没有求和了。
learningman
2021-08-19 13:40:49 +08:00
@kasusa #8 V2EX 只支持在主题中用 markdown,回复要贴代码要用 GitHub Gist
huntagain2008
2021-08-19 14:47:58 +08:00
@huntagain2008 改了下,还是不知道这次对不对。
>>>a=[-2, 1, 4, 9, -2, -3, 3, 8, 10, -1, -4, -7]
>>> b=[]
>>> for i in range(len(a)):
... if i<len(a)-1:
... if a[i]*a[i+1]>0:
... a[i+1]=a[i]+a[i+1] # 比如 1+3 取 4 的结果放在下标 a[1]
... else:
... b+=[a[i]] # 遇到正负不同的,比如遇到-2 取 a[2]作为和
... else:
... b+=[a[i]] # 最后一次求和
...
>>> b
[-2, 14, -5, 21, -12]
huntagain2008
2021-08-19 15:05:18 +08:00
@huntagain2008 改了下,还是不知道这次对不对。
>>>a=[-2, 1, 4, 9, -2, -3, 3, 8, 10, -1, -4, -7]
>>> b=[]
>>> for i in range(len(a)):
... if i<len(a)-1:
... ... if a[i]*a[i+1]>0:
... ... ... a[i+1]=a[i]+a[i+1] # 比如 1+3 取 4 的结果放在下标 a[1]
... ... else:
...... ... b+=[a[i]] # 遇到正负不同的,比如遇到-2 取 a[2]作为和
... else:
... ... b+=[a[i]] # 最后一次求和
...
>>> b
[-2, 14, -5, 21, -12]

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/796730

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX