如何拆分Python列表并按升序创建新列表?
在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=[]
[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
创建一个新的系列,将这些子列表作为行。我们在上面新创建的分组术语上进行分组,并将pythonlist
应用于该组中的那些值,从而创建“子”列表
最后,我们对序列应用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]]