2016-04-06 10 views
1

これは私の初めてのstackoverflowでの質問です。私はウェブ上でかなりの検索を行ったが、私が欲しいものは見つけられなかった。私の質問は、Pythonを使用してリスト内で連続する繰り返し数(または一般的な要素)の最大長を見つける方法です。私はうまく機能する次の関数を書いたが、これを行うか、コードを改善する良い方法があるのだろうかと思っていた。どうもありがとう!最大長さIは、以下の意味によってリスト(Python)で連続する繰り返し番号の最大長を見つける

def longest(roll): 
    '''Return the maximum length of consecutive repeated elements in a list.''' 
    i = 0 
    M = 0 # The maximum length 
    while 0 <= i < len(roll): 
     c = 1 # Temporarily record the length of consecutive elements 
     for j in range(i+1, len(roll)): 
      if roll[j] != roll[i]: 
       i = j 
       break 
      c += 1 
      i += 1  
     if c > M: 
      M = c 
     if i == len(roll) - 1: 
      break 
    return M 

[1、1、2、2、2、4]、M = 3(2を3回繰り返しました)。

[1,2,1,2,1]、M = 1(1と2は1回だけ繰り返される)。

答えて

3

itertoolsを使用できます。

In [8]: import itertools 

In [9]: z = [(x[0], len(list(x[1]))) for x in itertools.groupby(a)] 

In [10]: z 
Out[10]: [(1, 2), (2, 3), (3, 1)] 

タプルは(item, count)の形式です。与えられた数のランが複数ある場合、これも同様にグループ化されます。下記参照。

In [11]: a = [1,1,1,1,1,2,2,2,2,2,1,1,1,3,3] 

In [12]: z = [(x[0], len(list(x[1]))) for x in itertools.groupby(a)] 

In [13]: z 
Out[13]: [(1, 5), (2, 5), (1, 3), (3, 2)] 

最大値を取得するのは難しいことではありません。

In [15]: max(z, key=lambda x:x[1])[1] 
Out[15]: 5 
+0

ありがとうございます!非常に良いコード。また、(itertoolsのようなツールを使用せずに)プレーンなPythonコードを使ってこれを行う方法があるのだろうかと思っていました。それは非常に単純な質問のようですが、私は簡単な方法を見つけることができませんでした。元のコードを改善することは可能ですか?ありがとう! –

+0

ちょっと戻ってきます。私の頭の上から離れて、あなたのコードのロジックは健全ですが、他の改善はささいなことではありません。しかし、私はそれに亀裂を持ってみましょう。 :) – Manhattan

関連する問題