
请问如何高效计算 Python 列表连续正数或连续负数的和?
案例:[1,3,5,-2,-1,3,5,2,-1,-3,-3]
期望结果:[9,-3,10,-7]
1 unixeno Aug 19, 2021 via Android 这个不是循环一遍就出来了吗 |
2 zzzain46 Aug 19, 2021 via iPhone 请学习 for 循环 |
3 nobody1234 Aug 19, 2021 via iPhone 维护好两个下标,遍历一次搞定 |
4 lizytalk Aug 19, 2021 要说 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))) |
5 lizytalk Aug 19, 2021 如果不需要 pythonic 的话还是 for 循环吧,遍历一遍就可以 |
6 ch2 Aug 19, 2021 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) |
7 kasusa Aug 19, 2021 ``` 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) ``` 用到了数学中零点判定的知识。 |
8 kasusa Aug 19, 2021 ``` V2EX 不支持这个 markdown 语法吗? ``` |
9 kasusa Aug 19, 2021 ```html 是不是我的 markdown 语法有问题 >.> ``` |
10 Kilerd Aug 19, 2021 作业请独立完成 |
11 kasusa Aug 19, 2021 |
13 msg7086 Aug 19, 2021 只懂 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 里如果有类似的方法的话照着改一下就行了吧。 |
14 huntagain2008 Aug 19, 2021 非程序员,看着文档学了 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]作为和 |
15 kasusa Aug 19, 2021 感觉小题目还挺益智的。 不过 V2EX 显示代码真是难受。没有高亮、没有缩进。 |
16 huntagain2008 Aug 19, 2021 @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]作为和 ``` |
17 huntagain2008 Aug 19, 2021 @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 没有求和了。 |
18 learningman Aug 19, 2021 @kasusa #8 V2EX 只支持在主题中用 markdown,回复要贴代码要用 GitHub Gist |
19 huntagain2008 Aug 19, 2021 @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] |
20 huntagain2008 Aug 19, 2021 @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] |
21 Gorgine Aug 19, 2021 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)]) |
22 Gorgine Aug 19, 2021 |
23 fkdtz Aug 19, 2021 话题无关:楼上代码没有一个能正常格式化的,贴图也是,鲜有一次就能贴对的。好奇为啥回帖的 markdown 要搞得这么难以捉摸。 |
24 lostvincent Aug 19, 2021 没写过 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 |
26 zouzou0208 Aug 19, 2021 @lizytalk [sum(i[1]) for i in groupby(x, key=lambda _: _ > 0)] |
27 hahastudio Aug 19, 2021 可不可以有 0 ?有的话 0 怎么算?是继续还是单独算? gist.github.com/hahastudio/ec6c851a67c714ac40cf406a2aeeb525 |
28 laduary Aug 19, 2021 用 arr[idx] * arr[idx -1] 判断正负 https://paste.ubuntu.com/p/gpFNhcPwYm/ |
29 mxT52CRuqR6o5 Aug 19, 2021 via Android 随便写写都是 o(n),都差不多的 |
30 0ZXYDDu796nVCFxq Aug 19, 2021 via Android @hahastudio 0 其实不影响结果 |
31 zxCoder Aug 19, 2021 怎么个高效法。。。。 |
32 yinheli Aug 19, 2021 @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)] ``` |
33 ipwx Aug 20, 2021 在 C++ 里面我就 i=0; j=0 开始原地求和,最后设一下 size,最高效。 |
34 lixiang2017 Aug 20, 2021 via Android 说一下题外话。建议多刷题,这种在力扣属于 easy |
36 2i2Re2PLMaDnghL Aug 20, 2021 @lizytalk 这并不 pythonic,这是 functional 不过 list(map(...)) 都可以轻易地改成 comprehension list |
37 yucongo Aug 20, 2021 from functools import reduce lst = [1,3,5,-2,-1,3,5,2,-1,-3,-3] reduce(lambda x, y: x[:-1] + [x[-1] + lst[y]] if lst[y] * lst[y-1] > 0 else x +[lst[y]], range(1, len(lst[1:]) + 1), [lst[0]]) # [9, -3, 10, -7] |
39 rudy1224 Aug 21, 2021 把目前回帖里面的方法对比了一下,加上了使用 NumPy+Numba 的数据: ![]() 代码在此: <script src="https://gist.github.com/luhuidi/77ec31edfece0412d0058601e0f1a1ce.js"></script> |
40 imn1 Aug 26, 2021 代码我就懒得写了,楼上很多 for 都能搞定,我给另一个解法: itertools.groupby,把连续+/-的分组,然后每组 sum 就是了,代码少很多,应该两三行就够了 |
41 imn1 Aug 26, 2021 呃,原来有人说了,漏看了,pass |