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

如何拆分Python列表并按升序创建新列表?,python,list,Python,List,在Python中 如果有 [1,2,3,4,1,2,3,1,2,1] 名单, 当列表的大小减小到这样时,我想拆分列表 [1,2,3,4], [1,2,3], [1,2], [1] 如何编写它?这可能是您正在寻找的算法- a=[1,2,3,4,1,2,3,1,2,1] b=[] c=[] for i in range(len(a)-1): b.append(a[i]) if a[i] > a[i+1]: c.append(b) b=[]

在Python中 如果有

[1,2,3,4,1,2,3,1,2,1] 
名单, 当列表的大小减小到这样时,我想拆分列表

[1,2,3,4], [1,2,3], [1,2], [1]

如何编写它?

这可能是您正在寻找的算法-

a=[1,2,3,4,1,2,3,1,2,1]
b=[]
c=[]
for i in range(len(a)-1):
    b.append(a[i])
    if a[i] > a[i+1]:
        c.append(b)
        b=[]
print(c)
它输出已排序列表的列表-

[[1,2,3,4],[1,2,3],[1,2]]


如果有帮助,请告诉我。

您可以使用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()
输出:

[[1, 2, 3, 4], [1, 2, 3], [1, 2], [1]]
详细说明其工作原理: 首先从列表中创建熊猫系列,然后使用pd.series中的
diff
方法获取与上一个值的差值:

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
负值表示新“子”列表的开始。因此,我们使用
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
接下来,我们将使用
cumsum
创建一个分组术语
cumsum
仅在为真时递增,因此相邻的所有FALSE获得相同的值,然后为真递增,下一组FALSE获得该新值,直到下一个为真

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
现在,我们可以使用
groupby
apply
创建一个新的系列,将这些子列表作为行。我们在上面新创建的分组术语上进行分组,并将python
list
应用于该组中的那些值,从而创建“子”列表

最后,我们对序列应用
tolist
方法,以列表的形式返回序列

s.groupby(s.diff().lt(0).cumsum()).apply(list).tolist()
最终输出:

[[1, 2, 3, 4], [1, 2, 3], [1, 2], [1]]

如果您希望在下一个数字小于上一个数字时拆分列表,这可能会有所帮助:

arr = [1,2,3,4,1,2,3,1,2,1]
b = []
start = 0
for i in range(len(arr)):
  if(arr[i] < arr[i-1]):
    b.append(arr[start:i])
    start = i
b.append(arr[start:])
print(b)
arr=[1,2,3,4,1,2,3,1,2,1]
b=[]
开始=0
对于范围内的i(len(arr)):
如果(arr[i]
输出:
[[1,2,3,4]、[1,2,3]、[1,2]、[1]]


希望这对您有所帮助。

只是为了好玩,我想看看您是否可以重新编写文档中给出的代码,作为的示例实现,以满足您的一般需要。结果是生成一个生成器,其元素是表示子列表的子生成器。何时拆分的确定由两个变量的用户定义函数完成,该函数接受每对相邻元素,并在它们位于不同组时返回
True

from collections import deque class splitby: # [''.join(s) for s in splitby('AAAABBBCCDAABBB', operator.eq)] --> ['AAAA', 'BBB', 'CC', 'D', 'AA', 'BBB'] def __init__(self, iterable, splitter): self.splitfunc = splitter self.it = iter(iterable) self.segment = None def __iter__(self): return self def __next__(self): if self.segment: deque(self.segment, maxlen=0) if self.segment is None: raise StopIteration else: self.curvalue = next(self.it) self.segment = self._splitter() return self.segment def _splitter(self): split = False while not split: yield self.curvalue prev = self.curvalue try: self.curvalue = next(self.it) except StopIteration: self.segment = None return split = self.splitfunc(prev, self.curvalue) 结果是:

[[1, 2, 3, 4], [1, 2, 3], [1, 2], [1]]
这里有一个IDEOne链接:

TL;DR


在大多数情况下,这是一个巨大的过度杀伤力,所以不要这样做。我只是想找点乐子,但这里的代码确实从技术上解决了您的问题。如果你把这个类放在你的库中的某个地方,实际的用法是一行。

你能用你尝试过的东西(不管你觉得它有多低效)来编辑/附加你的问题吗?看看这个:@shash678我从I=0开始,并试图用一个“while”语句来处理它。@Doda好网站谢谢!我会推荐你的@金泰亨,请再投票给我另一个答案。我会打电话给你+1小时。。。有一种巧妙的方法可以做到这一点。让我申请吧!非常感谢。哇,想到使用b真是太棒了!非常感谢你。 from operator import gt x = [1, 2, 3, 4, 1, 2, 3, 1, 2, 1] [list(s) for s in splitby(x, gt)]
[[1, 2, 3, 4], [1, 2, 3], [1, 2], [1]]