我认为您不能使用简单的列表推导来做到这一点。一个简单的方法是普通的 for 循环方法 -
new_list = []
prev = float('inf')
for x in my_list:
if x < prev:
temp = []
new_list.append(temp)
temp.append(x)
prev = x
演示 -
>>> my_list = [1, 2, 3, 1, 2, 1, 2, 3]
>>> new_list = []
>>> prev = float('inf')
>>> for x in my_list:
... if x < prev:
... temp = []
... new_list.append(temp)
... temp.append(x)
... prev = x
...
>>> new_list
[[1, 2, 3], [1, 2], [1, 2, 3]]
这里给出的不同方法的时序比较-
代码-
from itertools import groupby
def func1(my_list):
new_list = []
prev = float('inf')
for x in my_list:
if x < prev:
temp = []
new_list.append(temp)
temp.append(x)
prev = x
return new_list
def func2(my_list):
brks = [i for i in range(1,len(my_list)) if my_list[i] < my_list[i-1]]
return [my_list[x:y] for x,y in zip([0]+brks,brks+[None])]
def func3(my_list):
return [list(next(g)) + [x[1] for x in g] for k, g in
groupby(zip(my_list, my_list[1:]), lambda x: x[1] >= x[0]) if k]
def func4(my_list):
results = []
for i, x in enumerate(my_list):
if i == 0:
results.append([x])
continue
if x < my_list[i - 1]:
results.append([x])
else:
results[-1].append(x)
return results
import random
my_list = [random.randint(1,10) for _ in range(1000)]
结果 -
In [20]: %timeit func1(my_list) #Simple for-loop
1000 loops, best of 3: 236 µs per loop
In [21]: %timeit func2(my_list) #List comprehension using breaks.
1000 loops, best of 3: 293 µs per loop
In [22]: %timeit func3(my_list) #@Ashwini's One-liner
1000 loops, best of 3: 689 µs per loop
In [23]: %timeit func4(my_list) #@electrometro's approach.
1000 loops, best of 3: 407 µs per loop
In [31]: %timeit func1(my_list)
1000 loops, best of 3: 223 µs per loop
In [32]: %timeit func2(my_list)
1000 loops, best of 3: 293 µs per loop
In [33]: %timeit func3(my_list)
1000 loops, best of 3: 703 µs per loop
In [34]: %timeit func4(my_list)
1000 loops, best of 3: 415 µs per loop