2016-04-06 13 views
1

Dies ist mein erstes Mal eine Frage zu Stackoverflow. Ich habe ziemlich viel im Internet gesucht, aber nicht gefunden, was ich will. Meine Frage ist, wie man die maximale Länge aufeinanderfolgender wiederholter Zahlen (oder Elemente im Allgemeinen) in einer Liste mit Python findet. Ich schrieb die folgende Funktion, die gut funktioniert, aber ich fragte mich, ob es eine bessere Möglichkeit gibt, dies zu tun oder meinen Code zu verbessern. Danke vielmals!finden Sie die maximale Länge der aufeinander folgenden wiederholten Zahlen in einer Liste (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 

von der maximalen Länge meine ich folgendes:

[1, 1, 2, 2, 2, 4], M = 3 (2-mal wiederholt, 3);

[1, 2, 1, 2, 1], M = 1 (1 und 2 nur einmal wiederholt).

Antwort

3

Sie können itertools verwenden.

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

Tupel sind in (item, count) Format. Wenn mehrere Läufe einer bestimmten Anzahl vorhanden sind, werden diese entsprechend gruppiert. Siehe unten.

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

Den Maximalwert zu bekommen, ist von hier aus nicht so schwer.

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

Danke! Sehr schöner Code. Ich habe mich auch gefragt, ob es eine Möglichkeit gibt, dies mit einfachem Python-Code zu tun (ohne Werkzeuge wie itertools zu verwenden). Es scheint eine sehr einfache Frage zu sein, aber ich konnte keinen einfachen Weg finden. Kann ich meinen ursprünglichen Code verbessern? Vielen Dank! –

+0

Wir kommen ein bisschen zurück zu dir. Von Kopf bis Fuß ist die Logik Ihres Codes solide, jede andere Verbesserung ist bestenfalls trivial. Aber lassen Sie mich einen Fehler machen. :) – Manhattan

Verwandte Themen