您可以使用以下复杂的单线:
from itertools import groupby
from operator import itemgetter
max(map(list,map(itemgetter(1),filter(itemgetter(0),groupby(data,key=lambda x:x&1)))),key=len)
data 输入列表。
让我们先把它分成几个部分:
from itertools import groupby
from operator import itemgetter
tmp = groupby(data,key=lambda x:x&1) # group by even-odd bursts
tmp = filter(itemgetter(0),tmp) # filter only bursts of odd numbers
tmp = map(itemgetter(1),tmp) # obtain the slice of numbers
tmp = map(list,tmp) # convert them to lists
result = max(tmp,key=len) # get the list with the largest length
此算法在 O(n) 中运行,因为它在 data 上执行固定数量的传递(由于 惰性 它实际上只扫描列表一次)列表。所有检查都是 O(1) (对于每个元素检查),或 O(k) 对于每个突发(k 的长度为爆发)。
您可以使用(感谢@PM2Ring)以功能较少的方式重写上述内容:
max((list(g) for k,g in groupby(data,key=lambda x:x&1) if k),key=len)
相当于上面的,但少了pointfree(这是函数式编程中的一个术语)。