2011-01-20 27 views

Odpowiedz

39

Wiele sposobów przychodzi na myśl. Można go zamienić na set (który odfiltrowuje duplikaty) i sprawdzić długość jednego Edycja: Jak zauważył inny plakat, działa to tylko z hashable; Odwołuję tę sugestię, ponieważ ma gorszą wydajność: i jest mniej ogólna.

Można użyć wyrażenia generatora: all(items[0] == item for item in items), które spowoduje zwarcie (tj. Zwróci wartość false, gdy tylko predykat zakończy się niepowodzeniem dla elementu, a nie będzie kontynuowany).

+0

+1 Korzystanie ze sprawdzania listy jest zalecane na mapie(). –

+0

@Artanis: To nie jest zrozumienie listy - dlatego jest lepsza od rozwiązania "set";) – delnan

+0

Dzięki! to jest proste i słodkie! – derks

3
>>> l = [1, 1, 1, 1] 
>>> all(map(lambda x: x == l[0], l)) 
True 
+1

Należy zwrócić uwagę, że to bezwarunkowo przechodzi przez listę while (jest kilka równie prostych rozwiązań, które nie mają zastosowania). – delnan

+0

'map' to iterator w Pythonie 3, więc' all' nie będzie iterować po pierwszej nierównej wartości. Lub w Pythonie 2 użyj 'functools.imap'. – PaulMcG

11
>>> a = [1, 1, 1, 1] 
>>> len(set(a)) 
1 

Należy zauważyć, że ta metoda zakłada, że ​​każdy element na liście można umieścić w zestawie. Niektóre typy, takie jak typy zmienne, nie mogą być umieszczone w zbiorze.

1

Korzystanie z set, jak wskazał Greg Hewgill, jest doskonałym rozwiązaniem. Oto kolejna, która jest leniwsza, więc jeśli jedna para elementów nie jest równa, reszta nie będzie porównywana. To może być wolniejsze niż rozwiązanie set podczas porównywania wszystkich elementów, ale nie zostało porównane.

l = [1, 1, 1] 
all(l[i] == l[i+1] for i in range(len(l)-1)) 

Uwaga na specjalny przypadek all([]) == True.

+0

Spowoduje to porównanie każdej pozycji z kolejną (i podniesienie błędu poza zakresem dla wejść o nieparzystej długości). – delnan

+0

@delnan: Tak, może lepiej wziąć pierwszy element (jeśli taki jest) i porównać go ze wszystkimi innymi. Ale co masz na myśli przez wprowadzenie nieparzystej długości? – AndiDog

+0

'' '', dla którego 'n = len (l)' jest nieparzyste, które nie kończy się, spróbuje uzyskać dostęp do 'l [n-1 + 1] = l [n]', który jest poza zakresem. – delnan

Powiązane problemy