2016-04-06 24 views
1

Bu, ilk defa stackoverflow hakkında bir soru sormak. İnternette biraz arama yaptım ama ne istediğimi bulamadım. Benim sorum python kullanarak bir listede ardışık tekrarlanan sayıların (veya genel olarak öğelerin) maksimum uzunluğunu bulmaktır. İyi çalışan işlevi yazdım ama bunu yapmanın veya kodumu geliştirmenin daha iyi bir yolu olup olmadığını merak ediyordum. Çok teşekkürler! Aşağıdaki ortalama maksimum uzunluğu ileBir listede art arda tekrarlanan sayıların uzunluğunu bulabilirsiniz (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 kez tekrar);

[1, 2, 1, 2, 1], M = 1 (1 ve 2 sadece bir kez tekrarlanır).

cevap

3

itertools'u kullanabilirsiniz.

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)] 

Kutular (item, count) biçimindedir. Belirli bir sayının birden fazla akışı varsa, bunlar da buna göre gruplanır. Aşağıya bakınız.

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)] 

Maksimum değeri almak bu kadar zor değil.

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

Teşekkürler! Çok güzel kod. Düz python kodu (itertools gibi araçlar kullanmadan) kullanarak bunu yapmanın bir yolu olup olmadığını da merak ediyordum. Çok basit bir soru gibi görünüyor, ama kolay bir şekilde anlayamadım. Orijinal kodumu geliştirmek mümkün mü? Teşekkürler! –

+0

Size birazdan geri döneceğim. Başımın üst kısmından, kodunuzun mantığı sağlamdır, diğer iyileştirmeler en iyi ihtimalle önemsizdir. Ama bana bir çatlaksın. :) – Manhattan

İlgili konular