如何拆分Python列表并按升序创建新列表?

Tae*_*Kim 3 python list

在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)

  • 我叫那一行.+1 (2认同)