from itertools import groupby
from operator import itemgetter
from collections import defaultdict
li = [-1, -1, 2, 2, -1, 1, 1, 1, 1, 1, -1, -1]
def sub_seq(li, n):
res = defaultdict(list)
for k, g in groupby(enumerate(li), itemgetter(1)):
l = list(map(itemgetter(0), g))
if n <= len(l): res[k] += l[0:len(l)-n+1]
return res
for i in (5,4,3,2):
print i, sub_seq(li,i)
from itertools import groupby, accumulate
from collections import defaultdict
def sub_seq(li, n):
d = defaultdict(list)
rle = [(k, len(list(g))) for k, g in groupby(li)]
endpoints = accumulate(size for k, size in rle)
for end_index, (value, count) in zip(endpoints, rle):
for index in range(end_index - count, end_index - n + 1):
d[value].append(index)
return dict(d)
正如raymondhettinger在他的回答中指出的,^{} 使检查连续值更容易。如果还枚举列表,则可以保留相应的索引并将其添加到字典中(我使用^{} 使函数尽可能短):
哪个打印:
^{pr2}$如果首先将数据转换为方便的形式,则分析数据通常更容易。在这种情况下,run-length-encoding将是一个很好的起点:
我个人认为这更具可读性,构造更少的对象,我猜运行速度更快。
相关问题 更多 >
编程相关推荐