我有一个像[1,2,3,4,6,7,8,9,10,12,14]
这样的排序列表
我寻找了不同的类似解决方案,但在我的情况下它们没有提供帮助
我希望此列表像这样输出
[ [1,4], [6,10], [12], [14] ]
因此基本上是一个列表的列表,其中包含序列的开头和结尾。
老实说看起来很简单,但是我现在有点坚持。任何帮助将不胜感激!
答案 0 :(得分:5)
您可以在more_itertools.consecutive_groups上使用https://pypi.org/project/more-itertools/
from more_itertools import consecutive_groups
#Get the groupings of consecutive items
li = [list(item) for item in consecutive_groups([1,2,3,4,6,7,8,9,10,12,14])]
#[[1, 2, 3, 4], [6, 7, 8, 9, 10], [12], [14]]
#Use the result to get range groupings
result = [ [item[0],item[-1]] if len(item) > 1 else [item[0]] for item in li]
print(result)
#[[1, 4], [6, 10], [12], [14]]
答案 1 :(得分:1)
解决方案看起来像这样
def make_ranges(l: list):
prev = l[0]
start = l[1]
res = []
for v in l[1:]:
if v - 1 != prev:
if start == prev:
res.append([start])
else:
res.append([start, prev])
start = v
prev = v
if l[-1] - 1 == l[-2]:
res.append([start, l[-1])
return res
例如:
print(make_ranges(list(range(10)) + list(range(13, 20)) + [22]))
此代码将打印[[0, 9], [13, 19], [22]]
答案 2 :(得分:1)
使用pandas
import pandas as pd
s = pd.Series([1,2,3,4,6,7,8,9,10,12,14])
s.groupby(s.diff().ne(1).cumsum()).apply(lambda x: [x.iloc[0], x.iloc[-1]] if len(x) >= 2 else [x.iloc[0]]).tolist()
输出
[[1, 4], [6, 10], [12], [14]]
答案 3 :(得分:1)
使用--add-exports=javafx.controls/javafx.scene.control.skin=$moduleName
numpy
输出:
import numpy as np
myarray = [1,2,3,4,6,7,8,9,10,12,14]
sequences = np.split(myarray, np.array(np.where(np.diff(myarray) > 1)[0]) + 1)
l = []
for s in sequences:
if len(s) > 1:
l.append((np.min(s), np.max(s)))
else:
l.append(s[0])
print(l)
答案 4 :(得分:0)
使用标准itertools
中的groupby
:
from itertools import groupby
lst = [1,2,3,4,6,7,8,9,10,12,14]
result = []
for k, g in groupby(enumerate(lst), lambda x: x[0] - x[1]):
g = list(map(lambda x: x[1], g))
if len(g) > 1:
result.append([g[0], g[-1]])
else:
result.append([g[0]])
print(result)
# [[1, 4], [6, 10], [12], [14]]