2016-08-01 19 views
1

Ich versuche zu identifizieren, ob eine große gegebene Liste aufeinanderfolgende Elemente hat, die gleich sind.Identifizieren, ob die Liste aufeinanderfolgende Elemente enthält, die in Python gleich sind

ist so

lst = [1, 2, 3, 4, 5, 5, 6] 

Und in diesem Fall sagen lassen, würde ich true zurück, da es zwei aufeinanderfolgende Elemente lst[4] und lst[5], sind der gleiche Wert.

Ich weiß, dass dies wahrscheinlich mit einer Art von Kombination von Schleifen getan werden könnte, aber ich frage mich, ob es eine effizientere Möglichkeit wäre, dies zu tun?

+0

Schleife. Singular. Und ich bezweifle es. Sie müssen sich jedes Element einmal ansehen, um zu wissen, ob es ein fortlaufendes Paar gibt. – Holloway

+0

Siehe auch https://stackoverflow.com/questions/5389507/iterating-over-every-two-elements-in-a-list und https://stackoverflow.com/questions/33116880/how-do-i-check -if-two-sequence-numbers-integers-in-a-list-have-the-same-val –

Antwort

7

Sie itertools.groupby() verwenden können, und einen Generator Ausdruck innerhalb any():

>>> from itertools import groupby 
>>> any(sum(1 for _ in g) > 1 for _, g in groupby(lst)) 
True 

Oder als mehr Pythonic Art und Weise Sie zip(), um verwenden können, wenn zumindest zu prüfen, gibt es zwei gleiche aufeinander folgende Elemente in der Liste:

>>> any(i==j for i,j in zip(lst, lst[1:])) # in python-2.x for refusing of creating a list of all pairs use itertools.izip() instead. 
True 

Hinweis: der erste Ansatz ist gut, wenn man, wenn überprüfen möchten mehr als zwei aufeinanderfolgenden gleichen Artikel sind, nehmen in diesem Fall anders, der zweite den Kuchen!

+0

Verliere 1 für die erste Lösung. Gewinne 1 für die Sekunde. Die "Itertools" sind nicht annähernd so klar. – Holloway

+0

@Holloway Ja, ich habe gerade den Vorteil der ersten Annäherung erwähnt. – Kasramvd

2

Wenn Sie sich für eine effiziente Art und Weise, dies zu tun und die Listen sind numerische suchen, würden Sie wahrscheinlich wollen numpy nutzen und anzuwenden, die diff (Differenz) Funktion:

>>> numpy.diff([1,2,3,4,5,5,6]) 
array([1, 1, 1, 1, 0, 1]) 

Dann einen einzigen zu erhalten Ergebnis in Bezug auf, ob es irgendwelche aufeinander folgenden Elemente:

>>> numpy.any(~numpy.diff([1,2,3,4,5,5,6]).astype(bool)) 

das erste führt die diff, invertiert die Antwort, und dann überprüft, ob any der resultierenden Elemente ungleich Null sind.

+0

Würde das nicht "True" zurückgeben, wenn es Duplikate gäbe?Es klingt, als ob die Frage nach fortlaufenden duplizierten Werten gefragt hätte. – johnchase

+0

@johnchase: Nein, da das 'diff' auf aufeinanderfolgenden Elementen funktioniert (ohne zu sortieren) – jmetz

+0

Okay, ich habe es jetzt bekommen. Schöne Lösung! – johnchase

1

Eine einfache for Schleife sollte es tun: wenn das aktuelle Element ist gleich das vorherige Element

def check(lst): 
    last = lst[0] 
    for num in lst[1:]: 
     if num == last: 
      return True 
     last = num 
    return False 


lst = [1, 2, 3, 4, 5, 5, 6] 
print (check(lst)) #Prints True 

in jeder Schleife Hier, I überprüfen.

2

können Sie verwenden eine einfacheany Bedingung:

lst = [1, 2, 3, 4, 5, 5, 6] 
any(lst[i]==lst[i+1] for i in range(len(lst)-1)) 
#outputs: 
True 

any Rückkehr True, wenn eine der iterable Elemente sind True

+0

Könnten Sie bitte erklären, was 'any' Funktion tut? Danke –

+1

Das wäre meine Antwort. Es lohnt sich, 'xrange' zu ​​beachten, wenn Sie python2 verwenden. – Holloway

+0

@VaibhavBajaj, gibt 'True' zurück, wenn eines der Argumente (oder Dinge, die über iteriert wurden) 'True' ist – Holloway

0

Meine Lösung für dieses, wenn Sie heraus, ob drei aufeinanderfolgende Werte finden wollen sind gleich 7. Zum Beispiel ein Tupel von intList = (7, 7, 7, 8, 9, 1):

for i in range(len(intList) - 1): 
     if intList[i] == 7 and intList[i + 2] == 7 and intList[i + 1] == 7: 
      return True 
    return False