2013-10-26 48 views
1

在Python中获取最长偶数位序列的最有效方法是什么?例如,如果我有一个数字2456890048,最长的序列应该是0048.获取整数中最长序列的偶数位数的最佳方法

整数应该转换为字符串以确定最长的序列吗?还是应该将它转换成列表,然后根据每个项目的索引,我们将确定哪个序列最长?还是有没有更有效的方式,我不知道(我对Python很新,我不知道什么是解决这个问题的最好方法)。

回答

5

您可以使用itertools.groupbymax

>>> from itertools import groupby 
def solve(strs): 
    return max((list(g) for k, g in groupby(strs, key=lambda x:int(x)%2) if not k), 
                      key=len) 
... 
>>> solve('2456890048') #or pass `str(2456890048)` if you've integers. 
['0', '0', '4', '8'] 
>>> solve('245688888890048') 
['6', '8', '8', '8', '8', '8', '8'] 

这里:

[list(g) for k, g in groupby('2456890048', key=lambda x:int(x)%2) if not k] 

回报:

[['2', '4'], ['6', '8'], ['0', '0', '4', '8']] 

现在,我们可以在这个列表上应用max(与key=len),以获得最长的序列。 (请注意,在原来的代码我使用与max发电机表达,所以在内存不创建的列表。)

+1

这可能不是最高效的,但它可能是最优雅的IMO。 – senderle

+0

谢谢!使用itertools过程,我将如何去查找序列在原始数字中以什么索引开始? – nanachan

+0

@nanachan是的,你需要遍历'enumerate(strs)'。 –

2

我认为这是最有效的方式

def longest(i): 
    curMax = m = 0 

    while i != 0: 
     d = i % 10 % 2 
     i = i/10 
     if d == 0: 
      curMax += 1 
     else: 
      m = max(m, curMax) 
      curMax = 0 

    return max(m, curMax) 

print longest(2456890048) 
+1

您可以检查'i%2'而不是'i%10%2'。 – thefourtheye

+1

我认为OP想要的是最长的序列,而不仅仅是它的长度。 –

+0

是的,我需要的是最长的序列 – nanachan

1

您可以提取一个所有使用正则表达式的偶数运行,并找到最长使用最大值。

import re 

def longest_run(d): 
    return max(re.findall('[02468]+', str(d)), key=len) 
+0

这太棒了。但我怀疑'再'是这里最好的选择。 –

+1

我认为你的意思是'def longest_run(s):'。否则,这不起作用。 – iCodez

+0

谢谢@iCodez,更正。 –

相关问题