2010-10-10 19 views
5

Mam listę:Jak sprawdzić, czy elementy pojawiają się na liście tylko raz w pythonie?

a = [1, 2, 6, 4, 3, 5, 7] 

Proszę mi wyjaśnić, w jaki sposób sprawdzić, czy elementem pojawia się tylko raz na liście?

Proszę również wyjaśnić, czy wszystkie elementy od 1 do len(a) znajdują się na liście. Na przykład na liście "a" element od 1 do 7 znajduje się na liście, ale jeśli lista to b = [1, 4, 3, 5], to nie wszystkie elementy od 1 do 4 nie znajdują się na liście.

Dziękujemy!

+1

Co masz na myśli przez * wtedy nie wszystkie elementy od 1 do 4 nie są na liście*? Skąd pochodzą * 1 do 4 *? –

+0

Dla pierwszego pytania, czy chcesz sprawdzić, czy * co * element pojawia się tylko raz, czy też * określony * element występuje tylko raz na liście? –

Odpowiedz

4
len(set(a)) == len(a) 

na pierwsze pytanie, a

(len(set(a)) == len(a) == max(a)) and min(a) == 1 

na sekundę.

+0

Druga odpowiedź wymaga, aby wszystkie elementy w 'a' były liczbami całkowitymi. – jfs

+1

Chciałbym tego o wiele więcej, gdyby było napisane w stylu pep8. W obecnej formie kod wygląda okropnie. –

+0

@ J.F.Sebastian: Tak, ale po prostu założyłem, że z pytania :) - @ Blue Peppers: Przepraszam, ale używam zbyt wielu różnych języków, aby mieć inny styl kodowania dla każdego; i to po prostu, jak najbardziej to lubię. – poke

5

Na pierwsze pytanie, jeśli elementy są hashable można utworzyć zestaw zawierający elementy i sprawdzić jego długość:

len(set(a)) == len(a) 

Alternatywnie można użyć tej funkcji, która może dać lepszą wydajność niż wymienione powyżej, jeżeli wynik jest fałszem (ale gorsza wydajność, gdy wynik jest prawda):

def are_all_elements_unique(l): 
    seen = set() 
    for x in l: 
     if x in seen: 
      return False 
     seen.add(x) 
    return True 
5

kiedy czytam swoje pytanie, wziąłem z niego inne znaczenie niż znak uczynił. Jeśli chcesz sprawdzić, czy dany element pojawia się tylko raz, a następnie

def occurs_once(a, item): 
    return a.count(item) == 1 

będzie prawdziwa tylko wtedy item występuje na liście dokładnie raz.

Zobacz Pokes odpowiedź na pytanie drugie

+0

Czy nie zakładasz, że lista nie zawiera podwójnych? Czy nie powinieneś tylko sprawdzić, czy każdy element w 'zakresie (1, n + 1)' jest w 'a'? –

+0

'range' jest generatorem w nowszych Pytonach. – poke

+0

Och, rozumiem, myślę, że rozumieliśmy to pytanie inaczej. Myślałem, że wszystkie liczby z "1 - n" powinny znajdować się na liście, niezależnie od kolejności i pozycji, i mogą być również mieszane z innymi numerami. –

1

zrozumiałem chcesz coś takiego:

[x for x in a if a.count(x) == 1] 
3

Na pytanie drugie może chcesz sprawdzić

sorted(a) == range(1, len(a) + 1) 
Powiązane problemy