Powiedzmy, że mam:

x= [2,2,2,2]
y= [2,1,2,2]

Czy jest jakiś schludny sposób sprawdzenia, czy element listy są równe czy nie. Więc chcę, żeby wyglądał jako:

x True
y False 
0
Mero 29 listopad 2013, 14:59

4 odpowiedzi

Najlepsza odpowiedź

Cóż, możesz użyć set:

>>> len(set(x)) == 1
True
>>> len(set(y)) == 1
False

Użyj następującego skryptu, który działa najszybciej dla Ciebie:

from timeit import timeit

# All the same
print timeit('len(set([2, 2, 2, 2])) == 1')
# 0.843292317054

# Not the same
print timeit('len(set([2, 1, 2, 2])) == 1')
# 0.869108628247

## Without set ##

# AlL the same
print timeit('all(item == x[0] for item in x)', setup='x = [2,2,2,2]')
# 1.20339177387

# Not the same
print timeit('all(item == x[0] for item in x)', setup='x = [2, 1, 2, 2]')
# 1.42827283125

Z mojego doświadczenia, używając set wydaje się być najszybszym sposobem.

5
Games Brainiac 29 listopad 2013, 18:00

Jeśli zależy ci trochę o wydajności, a listy mogą być długie:

all(item == x[0] for item in x)

To kończy się, gdy tylko znajdzie nie równy element. Bądź świadomy, że all zwraca True dla pustej sekwencji, więc jeśli nie jest to wynik, który chcesz, a następnie przetestuj len(x).

Czasy, na przypadek celowo olinowany, aby faworyzować moją odpowiedź:

$ python --version
Python 2.7.5

$ python -mtimeit "x = range(1000000)"
10 loops, best of 3: 18 msec per loop

$ python -mtimeit "x = range(1000000); all(item == x[0] for item in x)"
100 loops, best of 3: 19.2 msec per loop

$ python -mtimeit "x = range(1000000); all(item == x[0] for item in x[1:])"
10 loops, best of 3: 35.6 msec per loop

$ python -mtimeit "x = range(1000000); len(set(x)) == 1"
10 loops, best of 3: 72.7 msec per loop

Dbając o "trochę", wystarczy podjąć łatwe kroki, aby uniknąć możliwych dużych ilości nieznanej pracy i użytkowania pamięci. Jeśli opiekujesz się partia o wydajności, ponieważ ta linia kodu jest naprawdę krytyczna, wtedy jest coś, co możesz zrobić, aby zmienić moją odpowiedź. Pierwszą rzeczą, która sprężyny na myśl, unikanie własnego porównania w elemencie 0, ale nie wiem, czy itertools.islice ma wystarczająco niską głową, aby być wygraną netto. Musisz to przetestować.

5
Steve Jessop 29 listopad 2013, 13:59

Prostym sposobem jest konwersja listy do zestawu i sprawdzić długość zestawu:

def has_only_one_element(xs):
    return len(set(xs)) == 1
4
svk 29 listopad 2013, 11:00

Mam nadzieję, że ta funkcja działa dla ciebie ...

def chk_similar_ele(inp_list):
   return inp_list.count(inp_list[0]) == len(inp_list)
0
Aks 2 grudzień 2013, 06:26