在Python中如果有
[1,2,3,4,1,2,3,1,2,1]
Run Code Online (Sandbox Code Playgroud)
列表,我希望在大小减小时拆分列表
[1,2,3,4], [1,2,3], [1,2], [1]
Run Code Online (Sandbox Code Playgroud)
我该如何编码?
Sco*_*ton 11
您可以使用Pandas在三行中执行此操作:
import pandas as pd
s = pd.Series([1,2,3,4,1,2,3,1,2,1])
s.groupby(s.diff().lt(0).cumsum()).apply(list).tolist()
Run Code Online (Sandbox Code Playgroud)
输出:
[[1, 2, 3, 4], [1, 2, 3], [1, 2], [1]]
Run Code Online (Sandbox Code Playgroud)
首先从列表中创建一个pandas系列,然后使用diffpd.Series中的方法获取与前一个值的差异:
s.diff()
0 NaN
1 1.0
2 1.0
3 1.0
4 -3.0
5 1.0
6 1.0
7 -2.0
8 1.0
9 -1.0
dtype: float64
Run Code Online (Sandbox Code Playgroud)
负值表示新"子"列表的开始.因此,我们lt(0)用来标记那些应该开始新的"子"列表的记录.
s.diff().lt(0)
0 False
1 False
2 False
3 False
4 True
5 False
6 False
7 True
8 False
9 True
dtype: bool
Run Code Online (Sandbox Code Playgroud)
接下来,我们将使用cumsum创建分组术语.cumsum只有在True时才会递增,所以彼此相邻的所有falses都会获得相同的值,然后True递增并且下一组falses获得该新值,直到下一个True.
s.diff().lt(0).cumsum()
0 0
1 0
2 0
3 0
4 1
5 1
6 1
7 2
8 2
9 3
dtype: int32
Run Code Online (Sandbox Code Playgroud)
现在,我们可以使用groupbywith apply创建一个新系列,将这些子列表作为行.我们正在从上面对新创建的分组术语进行分组,并将python应用于该list组中的那些值,从而创建"子"列表.
s.groupby(s.diff().lt(0).cumsum()).apply(list)
0 [1, 2, 3, 4]
1 [1, 2, 3]
2 [1, 2]
3 [1]
dtype: object
Run Code Online (Sandbox Code Playgroud)
最后,我们将该tolist方法应用于该系列以将该系列作为列表返回.
s.groupby(s.diff().lt(0).cumsum()).apply(list).tolist()
Run Code Online (Sandbox Code Playgroud)
最终产出:
[[1, 2, 3, 4], [1, 2, 3], [1, 2], [1]]
Run Code Online (Sandbox Code Playgroud)