通过对两个连续的零进行条件检查进行分组来创建子列表

use*_*315 3 python python-2.7

我有一个清单:

lst = [0, -7, 0, 0, -8, 0, 0, -4, 0, 0, 0, -6, 0, -4, -29, -10, 0, -16, 0, 0, 2, 3, 0, 18, -1, -2, 0, 0, 0, 0, 0, 0, 21, 10, -10, 0, -12, 3, -5, -10]
Run Code Online (Sandbox Code Playgroud)

我希望在值后跟两个连续的零时创建带有条件中断的子列表组.

所以我的中间清单会喜欢

newlst = [-7,-8,-4,[-6,-4,-29,-10,-16],[2,3,18,-1,-2],[21,10,-10,-12,3,-5,-10]]
Run Code Online (Sandbox Code Playgroud)

而最终输出将是子列表的总和:

[-7,-8,-4,-65,18,-3]
Run Code Online (Sandbox Code Playgroud)

我尝试在枚举的for循环中使用索引号,但我没有得到我想要的输出.

Ste*_*ann 6

我根据他们是否持有任何真相来对相邻数字组成对.然后拿起真正的小组并总结它们.可能有点太复杂,但我喜欢使用any密钥.

>>> from itertools import groupby
>>> [sum(a for a, _ in g) for k, g in groupby(zip(lst, lst[1:] + [0]), any) if k]
[-7, -8, -4, -65, 20, -3]
Run Code Online (Sandbox Code Playgroud)

(感谢blhsing和ShadowRanger的改进.)

将对将变回单一的更短的方式(首先是Python 2,第二是Python 3):

>>> [sum(zip(*g)[0]) for k, g in groupby(zip(lst, lst[1:] + [0]), any) if k]
>>> [sum(next(zip(*g))) for k, g in groupby(zip(lst, lst[1:] + [0]), any) if k]
Run Code Online (Sandbox Code Playgroud)

  • @blhsing:你不明白`groupby`的工作原理.`g`是包含所有对的迭代器,其中对中的至少一个元素是非零的,由`groupby`产生的`tuple的第一个元素(`_`,我们忽略)只是关键与该组相关联的值(由于`key`函数是'any`,它将变为'True`或'False`).如果你从`lst`中弹出前导'0',它就可以正常运行,因为它根本不依赖于它. (2认同)