5

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

 3 years ago
source link: https://www.v2ex.com/t/796730
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

V2EX  ›  Python

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

  going · 13 小时 41 分钟前 · 1457 次点击

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

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

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

34 条回复    2021-08-20 01:08:23 +08:00

unixeno

unixeno   13 小时 39 分钟前 via Android

这个不是循环一遍就出来了吗

zzzain46

zzzain46   13 小时 23 分钟前 via iPhone

请学习 for 循环

nobody1234

nobody1234   13 小时 20 分钟前 via iPhone

维护好两个下标,遍历一次搞定

lizytalk

lizytalk   13 小时 9 分钟前   ❤️ 5

要说 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

lizytalk   13 小时 9 分钟前   ❤️ 1

如果不需要 pythonic 的话还是 for 循环吧,遍历一遍就可以

ch2

ch2   13 小时 7 分钟前

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

kasusa   13 小时 5 分钟前

```
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

kasusa   13 小时 5 分钟前

```
V2EX 不支持这个 markdown 语法吗?

```

kasusa

kasusa   13 小时 2 分钟前

```html
是不是我的 markdown 语法有问题 >.>
```

Kilerd

Kilerd   13 小时 2 分钟前

作业请独立完成

zmxnv123

zmxnv123   12 小时 59 分钟前

@lizytalk 你这个不是连续的吧

msg7086

msg7086   12 小时 38 分钟前

只懂 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

huntagain2008   12 小时 34 分钟前

非程序员,看着文档学了 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

kasusa   12 小时 30 分钟前

感觉小题目还挺益智的。
不过 V2EX 显示代码真是难受。没有高亮、没有缩进。

huntagain2008

huntagain2008   12 小时 30 分钟前

@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

huntagain2008   12 小时 11 分钟前

@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

learningman   12 小时 6 分钟前

@kasusa #8 V2EX 只支持在主题中用 markdown,回复要贴代码要用 GitHub Gist

huntagain2008

huntagain2008   10 小时 59 分钟前

@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

huntagain2008   10 小时 42 分钟前

@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]

Gorgine

Gorgine   9 小时 51 分钟前

from itertools import groupby
your_list = [1, 3, 5, -2, -1, 3, 5, 2, -1, -3, -3]
print([sum(item[1]) for item in groupby(your_list, lambda item: item > 0)])

fkdtz

fkdtz   9 小时 32 分钟前   ❤️ 1

话题无关:楼上代码没有一个能正常格式化的,贴图也是,鲜有一次就能贴对的。好奇为啥回帖的 markdown 要搞得这么难以捉摸。

lostvincent

lostvincent   9 小时 25 分钟前

没写过 py,就写点伪代码了

list = [...]
result = []
total = list[0]

for (i = 1; i < len(list)); i++) {
// total 和 list[i] 同符号
if ((total > 0) === (list[i] > 0)) {
total += list[i]
} else {
append(result, total)
total = list[i]
}
}

append(result, total)
return result

========
思路就是 total 记录累加
total 和当前元素符号(正负号)不同了,就记录累加结果到 result,重置 total 然后开始下一轮
题目写的是连续正负数,如果有 0 的话,遇到直接 continue

kasusa

kasusa   9 小时 17 分钟前

@fkdtz 好像是只有帖子本身支持 markdown,但是回复贴不支持。

zouzou0208

zouzou0208   9 小时 1 分钟前

@lizytalk [sum(i[1]) for i in groupby(x, key=lambda _: _ > 0)]

mxT52CRuqR6o5

mxT52CRuqR6o5   3 小时 22 分钟前 via Android

随便写写都是 o(n),都差不多的

gstqc

gstqc   3 小时 10 分钟前 via Android

@hahastudio 0 其实不影响结果

zxCoder

zxCoder   3 小时 1 分钟前

怎么个高效法。。。。

yinheli

yinheli   2 小时 21 分钟前

@lizytalk 直接把 group 结果做 sum 不就可以?

```python

from itertools import groupby
[sum(g) for _, g in groupby([1,3,5,-2,-1,3,5,2,-1,-3,-3], key=lambda x: x > 0)]

```

ipwx

ipwx   1 小时 27 分钟前

在 C++ 里面我就 i=0; j=0 开始原地求和,最后设一下 size,最高效。

lixiang2017

lixiang2017   39 分钟前 via Android

说一下题外话。建议多刷题,这种在力扣属于 easy

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK