2015-07-01 20 views
12

Jaki jest najlepszy/najbardziej skuteczny sposób sprawdzenia, czy wszystkie wartości krotki? Czy muszę powtórzyć wszystkie krotki i sprawdzić czy jest jeszcze lepszy sposób?Jaki jest najlepszy sposób sprawdzenia, czy krotka ma puste/Brak wartości w Pythonie?

Na przykład:

t1 = (1, 2, 'abc') 
t2 = ('', 2, 3) 
t3 = (0.0, 3, 5) 
t4 = (4, 3, None) 

Sprawdzanie te krotki, każda krotka wyjątkiem t1, należy wrócić prawda, co oznacza, że ​​jest tzw pusta wartość.

P.S. jest to pytanie: Test if tuple contains only None values with Python, ale jest to tylko około Żadne wartości

+4

Jak "nie wszystkie (tn)"? – jonrsharpe

+0

Oh, to by zrobiło :) – Andrius

Odpowiedz

21

To bardzo proste:

not all(t1) 

powraca False tylko wtedy, gdy wszystkie wartości w t1 są niepuste/niezerowe i nie None. all zwarcia, więc musi tylko sprawdzić elementy do pierwszego pustego, co czyni go bardzo szybkim.

+0

Działa również dla 'namedtuple' (ponieważ jest to podklasa, oczywiście) =) – jpmc26

+0

@TimPietzcker: Przepraszam, masz rację, czytam zbyt szybko. – lodebari

+0

@TimPietzcke Myślę, że to również sprawdza wartość Fałsz (Boolean), jeśli jedna z wartości w krotce to False all (t1) zwróci False – sau

0

Dla konkretnego przypadku można użyć funkcji all(), sprawdza ona, czy wszystkie wartości na liście są prawdziwe lub fałszywe, należy pamiętać, że w pythonie None puste ciągi i 0 są uznawane za fałszywe.

Więc -

>>> t1 = (1, 2, 'abc') 
>>> t2 = ('', 2, 3) 
>>> t3 = (0.0, 3, 5) 
>>> t4 = (4, 3, None) 
>>> all(t1) 
True 
>>> all(t2) 
False 
>>> all(t3) 
False 
>>> all(t4) 
False 
>>> if '': 
...  print("Hello") 
... 
>>> if 0: 
...  print("Hello") 
2

Odpowiedź używając wszystko zostało dostarczone:

not all(t1) 

Jednak w takim wypadku t3, to powróci prawda, ponieważ jedna z wartości jest 0:

t3 = (0.0, 3, 5) 

"Wszystkie" wbudowane słowo kluczowe sprawdza, czy wszystkie wartości danej iteracji są wartościami, które mają ujemną wartość logiczną (F alse). 0, 0.0, "" i None all oceniają jako Fałsz.

Jeśli chcesz tylko przetestować za brak (jak sugeruje tytuł pytanie), to działa:

any(map(lambda x: x is None, t3)) 

ta zwraca True, jeśli któryś z elementów t3 jest None, czy fałsz, jeżeli żaden z oni są.