我正在寻找最基本的方法,根据序列中缺少的数字将数字列表拆分为较小的列表。例如,如果初始列表是:
seq1 = [1, 2, 3, 4, 6, 7, 8, 9, 10]
该函数将产生:
[[1, 2, 3, 4], [6, 7, 8, 9, 10]]
或
seq2 = [1, 2, 4, 5, 6, 8, 9, 10]
会导致:
[[1, 2], [4, 5, 6], [8, 9, 10]]
答案 0 :(得分:38)
>>> # Find runs of consecutive numbers using groupby. The key to the solution
>>> # is differencing with a range so that consecutive numbers all appear in
>>> # same group.
>>> data = [ 1, 4,5,6, 10, 15,16,17,18, 22, 25,26,27,28]
>>> for k, g in groupby(enumerate(data), lambda (i,x):i-x):
... print map(itemgetter(1), g)
...
[1]
[4, 5, 6]
[10]
[15, 16, 17, 18]
[22]
[25, 26, 27, 28]
每次键函数更改其返回值时,itertools模块中的groupby()函数都会生成一个中断。诀窍是返回值是列表中的数字减去列表中元素的位置。当数字存在差距时,这种差异会发生变化。
itemgetter()函数来自operator module,您必须导入此函数并使用itertools模块才能使用此示例。
您的数据的完整示例:
>>> from operator import itemgetter
>>> from itertools import *
>>> seq2 = [1, 2, 4, 5, 6, 8, 9, 10]
>>> list = []
>>> for k, g in groupby(enumerate(seq2), lambda (i,x):i-x):
... list.append(map(itemgetter(1), g))
...
>>> print list
[[1, 2], [4, 5, 6], [8, 9, 10]]
或者作为列表理解:
>>> [map(itemgetter(1), g) for k, g in groupby(enumerate(seq2), lambda (i,x):i-x)]
[[1, 2], [4, 5, 6], [8, 9, 10]]
答案 1 :(得分:5)
另一个不需要itertools等的选项:
>>> data = [1, 4, 5, 6, 10, 15, 16, 17, 18, 22, 25, 26, 27, 28]
>>> spl = [0]+[i for i in range(1,len(data)) if data[i]-data[i-1]>1]+[None]
>>> [data[b:e] for (b, e) in [(spl[i-1],spl[i]) for i in range(1,len(spl))]]
... [[1], [4, 5, 6], [10], [15, 16, 17, 18], [22], [25, 26, 27, 28]]
答案 2 :(得分:5)
这是一个适用于Python 3的解决方案(基于之前仅在python 2中工作的答案)。
>>> from operator import itemgetter
>>> from itertools import *
>>> groups = []
>>> for k, g in groupby(enumerate(seq2), lambda x: x[0]-x[1]):
>>> groups.append(list(map(itemgetter(1), g)))
...
>>> print(groups)
[[1, 2], [4, 5, 6], [8, 9, 10]]
或作为列表理解
>>> [list(map(itemgetter(1), g)) for k, g in groupby(enumerate(seq2), lambda x: x[0]-x[1])]
[[1, 2], [4, 5, 6], [8, 9, 10]]
需要进行更改,因为
答案 3 :(得分:1)
我更喜欢这个,因为它不需要任何额外的库或特殊情况的特殊处理:
a = [1, 2, 3, 4, 5, 6, 7, 8, 10, 11, 12, 15, 16, 17, 18, 20, 21, 22]
b = []
subList = []
prev_n = -1
for n in a:
if prev_n+1 != n: # end of previous subList and beginning of next
if subList: # if subList already has elements
b.append(subList)
subList = []
subList.append(n)
prev_n = n
if subList:
b.append(subList)
print a
print b
输出:
[1、2、3、4、5、6、7、8、10、11、12、15、16、17、18、20、21、22]
[[1、2、3、4、5、6、7、8],[10、11、12],[15、16、17、18],[20、21、22]] >
答案 4 :(得分:0)
我的方式
alist = [1, 2, 3, 4, 5, 6, 7, 8, 10, 11, 12, 15, 16, 17, 18, 20, 21, 22]
newlist = []
start = 0
end = 0
for index,value in enumerate(alist):
if index < len(alist)-1:
if alist[index+1]> value+1:
end = index +1
newlist.append(alist[start:end])
start = end
else:
newlist.append(alist[start: len(alist)])
print(newlist)
结果
[[1, 2, 3, 4, 5, 6, 7, 8], [10, 11, 12], [15, 16, 17, 18], [20, 21, 22]]