>>> from itertools import groupby
>>> L = [3,5,0,6,8,9,7,0,1,0]
>>> [list(g) for k, g in groupby(L, key=bool) if k]
[[3, 5], [6, 8, 9, 7], [1]]
Run Code Online (Sandbox Code Playgroud)
key=bool在这种情况下工作,因为0被认为是空的,但正如@AshwiniChaudhary所指出的那样,key当你没有分裂时,你将不得不使用自定义函数0.分裂2
key=lambda x: x != 2
Run Code Online (Sandbox Code Playgroud)
说明:
首先,我将说明key工作原理:
>>> bool(3), bool(5)
(True, True)
>>> bool(0)
False
Run Code Online (Sandbox Code Playgroud)
正如你所看到的,或者返回True或者False,False在0与True对其他任何东西.(其实bool('')和bool([])还回False,以及任何其他空的内置对象,但我们只在这里考虑的数字)
所以groupby简单地将key函数的结果分组,因此分组为0s和1s.
>>> [(key, group) for key, group in groupby(L, key=bool)]
[(True, <itertools._grouper object at 0xb6fc1dac>), (False, <itertools._grouper object at 0xb6fc432c>), (True, <itertools._grouper object at 0xb6fc422c>), (False, <itertools._grouper object at 0xb6fc4c2c>), (True, <itertools._grouper object at 0xb6fc428c>), (False, <itertools._grouper object at 0xb6fc476c>)]
Run Code Online (Sandbox Code Playgroud)
但是你可以看到这个组,是一个奇怪的对象,一个itertools._grouper对象.为什么不返回列表呢?itertools在分组项目懒洋洋这是更为有效的,但离开的工作,我们的消费群中的所有项目成list.
>>> [(key, list(group)) for key, group in groupby(L, key=bool)]
[(True, [3, 5]), (False, [0]), (True, [6, 8, 9, 7]), (False, [0]), (True, [1]), (False, [0])]
Run Code Online (Sandbox Code Playgroud)
但是我们不需要它key,我们只需要检查它是否True只返回满足这个谓词的项目,从而在开始时得到我的答案.
>>> [list(group) for key, group in groupby(L, key=bool) if key]
[[3, 5], [6, 8, 9, 7], [1]]
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
171 次 |
| 最近记录: |