如何在Python中找到最长的连续奇数子序列?

如何在Python中找到最长的连续奇数子序列?,python,dynamic-programming,Python,Dynamic Programming,例如,我的序列是:[2,6,8,3,9,1,5,6,1,3,5]那么答案应该是[3,9,1,5],因为有两个子序列[1,3,5]和[3,9,1,5]。应返回最长的一个作为答案。任何帮助都将不胜感激。您可以尝试以下方法: l = [2, 6, 8, 3, 9, 1, 5, 6, 1, 3, 5] final_list = [] for i in l: new_l = [] if i%2 == 0: final_list.append(new_l) new_l =

例如,我的序列是:
[2,6,8,3,9,1,5,6,1,3,5]
那么答案应该是[3,9,1,5],因为有两个子序列
[1,3,5]
[3,9,1,5]
。应返回最长的一个作为答案。任何帮助都将不胜感激。

您可以尝试以下方法:

l = [2, 6, 8, 3, 9, 1, 5, 6, 1, 3, 5]
final_list = []
for i in l:
   new_l = []
   if i%2 == 0:
      final_list.append(new_l)
      new_l = []
   else:
       new_l.append(i)

print(max(final_list, key=len))
输出:

[3, 9, 1, 5]

您可以使用以下复杂的单衬套:

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)
使用
数据
输入列表

让我们首先将其分为几个部分:

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)中运行,因为它在
数据
列表上执行固定次数的传递(由于懒散,实际上只扫描列表一次)。所有检查为O(1)(针对每个元素检查),或O(k)针对每个突发(k为该突发的长度)

您可以用一种不太实用的方式重写上述内容,方法是(很荣幸):


它与上述内容相同,但没有什么意义(这是函数式编程中的一个术语)。

您能展示您目前的尝试吗?具体在哪里?看看
itertools.groupby
我真的不明白为什么要为
循环执行嵌套的
。现在你把它变成一个O(n^2)算法。一次就够了。此外,由于
[i+1::]
,您忽略了第一个元素。这正是我要寻找的。非常感谢:)只是一个更正:第一个
new_l
作业应该在循环的上方,否则它会打印一个空列表。:)是的,好的。就个人而言,我不会在这里使用
itemgetter
,我只会使用
max((列表(g)表示k,g在groupby(a,key=lambda n:n%2)中,如果k),key=len)
@PM2Ring:yes。这可能更多是因为太多的函数式编程。前者被认为“更无意义”。
max((list(g) for k,g in groupby(data,key=lambda x:x&1) if k),key=len)