3 回答

TA貢獻1833條經驗 獲得超4個贊
用 more_itertools.consecutive_groups
import more_itertools as mit
my_list = [1,2,3,4,5,9,10,11,12,13,14,15]
x = [list(group) for group in mit.consecutive_groups(my_list)]
oputput = []
for i in x:
temp = [i[0],i[1],i[-2],i[-1]]
output.extend(temp)
輸出:
[1,2,4,5,9,10,14,15]

TA貢獻1811條經驗 獲得超4個贊
您可以通過將列表與自身的偏移量為 1 進行壓縮來配對相鄰的列表項,但使用非連續(xù)值填充移位的列表,以便您可以遍歷配對并確定存在一個單獨的組一對不是 1:
def consecutive_groups(l):
o = []
for a, b in zip([l[0] - 2] + l, l):
if b - a != 1:
o.append([])
o[-1].append(b)
return [s[:2] + s[-2:] for s in o]
給定您的樣本輸入,consecutive_groups(my_list)返回:
[[1, 2, 4, 5], [9, 10, 13, 14], [20, 21, 26, 27]]

TA貢獻1842條經驗 獲得超22個贊
僅使用標準itertools模塊,您可以執(zhí)行以下操作:
from itertools import count, groupby
def remove_middle_of_seq(lst):
out = []
index = count()
for _, sequence in groupby(lst, lambda value: value - next(index)):
seq = list(sequence)
out.extend([seq[0], seq[1], seq[-2], seq[-1]])
return out
my_list = [1,2,3,4,5, 9,10,11,12,13,14, 20,21,22,23,24,25,26,27]
print(remove_middle_of_seq(my_list))
# [1, 2, 4, 5, 9, 10, 13, 14, 20, 21, 26, 27]
在連續(xù)值的組中,值與其索引之間的差異是恒定的,因此groupby可以使用此差異作為關鍵字對它們進行分組。
添加回答
舉報