Próbuję zrozumieć, jak działają funkcje wbudowane any()
i all()
Python.
Próbuję porównać krotki, aby jeśli jakakolwiek wartość była inna, to ona zwróci True
i jeśli wszystkie są takie same, zwróci False
. Jak w tej sprawie pracują nad zwrotem [Fałsz, Fałsz, Fałsz]?
d
jest defaultdict(list)
.
print d['Drd2']
# [[1, 5, 0], [1, 6, 0]]
print list(zip(*d['Drd2']))
# [(1, 1), (5, 6), (0, 0)]
print [any(x) and not all(x) for x in zip(*d['Drd2'])]
# [False, False, False]
O ile mi wiadomo, powinno to dać wynik
# [False, True, False]
ponieważ (1,1) są takie same, (5,6) są różne, a (0,0) są takie same.
Dlaczego dla wszystkich krotek ma wartość False?
Odpowiedzi:
Można z grubsza myśleć
any
iall
jak seria logicznychor
iand
operatorów, odpowiednio.każdy
any
powróci,True
gdy co najmniej jeden z elementów jest Prawdą. Przeczytaj o testowaniu wartości prawdy.wszystko
all
powróciTrue
tylko wtedy, gdy wszystkie elementy są Prawdą.Tabela prawdy
Uwaga 1: Pusta iterowalna sprawa jest wyjaśniona w oficjalnej dokumentacji, tak jak to
any
Ponieważ żaden z elementów nie jest prawdziwy, zwraca się
False
w tym przypadku.all
Ponieważ żaden z elementów nie jest fałszywy,
True
w tym przypadku zwraca wartość .Uwaga 2:
Kolejną ważną rzeczą, aby wiedzieć
any
iall
to, że będzie zwarcie wykonanie, moment znają wynik. Zaletą jest to, że nie trzeba zużywać całej iteracji. Na przykład,Tutaj
(not (i % 6) for i in range(1, 10))
jest wyrażenie generator, który powracaTrue
jeśli obecna liczba w ciągu 1 do 9 jest wielokrotnością 6.any
iterujemultiples_of_6
a kiedy spotyka6
, to znajdzie wartość Truthy, więc natychmiast wracaTrue
, a resztamultiples_of_6
nie powtórzyć. To, co widzimy, kiedy drukowaćlist(multiples_of_6)
, wynik7
,8
i9
.Ta doskonała rzecz została wykorzystana bardzo sprytnie w tej odpowiedzi .
Z tym podstawowym zrozumieniem, jeśli spojrzymy na twój kod, robisz to
co zapewnia, że przynajmniej jedna z wartości jest Prawda, ale nie wszystkie. Właśnie dlatego powraca
[False, False, False]
. Jeśli naprawdę chcesz sprawdzić, czy obie liczby nie są takie same,źródło
bool(data) and all(...)
powinno działać.any
iall
weź iterable i zwróć,True
jeśli są jakieś i wszystkie (odpowiednio) elementyTrue
.Jeśli iteracje są puste,
any
zwracaFalse
iall
zwracaTrue
.Demonstrowałem dzisiaj
all
iany
dla uczniów w klasie. Byli w większości zdezorientowani co do wartości zwracanych dla pustych iteracji. Wyjaśnienie tego w ten sposób spowodowało włączenie wielu żarówek.Skrótowe zachowanie
Oni,
any
iall
zarówno spojrzenie na chorobę, która pozwala im przestać oceny. Pierwsze przykłady, które podałem, wymagały od nich oceny wartości logicznej dla każdego elementu na całej liście.(Zauważ, że literał listy sam w sobie nie jest leniwie oceniany - można to uzyskać za pomocą Iteratora - ale służy to wyłącznie celom ilustracyjnym).
Oto implementacja Pythona dla wszystkich:
Oczywiście rzeczywiste implementacje są napisane w C i są znacznie wydajniejsze, ale możesz zastąpić powyższe i uzyskać te same wyniki dla kodu w tej (lub innej) odpowiedzi.
all
all
sprawdza, czy elementy mają byćFalse
(aby mógł zwrócićFalse
), a następnie zwraca,True
jeśli żaden z nich nie byłFalse
.any
Sposób
any
działania polega na tym, że sprawdza, czy istnieją elementyTrue
(aby mógł zwrócićTrue), then it returns
Falseif none of them were
True`.Myślę, że jeśli weźmiesz pod uwagę krótkie zachowanie, intuicyjnie zrozumiesz, jak one działają, bez konieczności odwoływania się do Tabeli Prawdy.
Dowody
all
iany
skróty:Najpierw utwórz noisy_iterator:
a teraz przejdźmy głośno do list, korzystając z naszych przykładów:
Widzimy
all
zatrzymania na pierwszym fałszywym czeku logicznym.I
any
zatrzymuje się przy pierwszym teście logicznym True:Źródło
Spójrzmy na źródło, aby potwierdzić powyższe.
Oto źródło
any
:A oto źródło
all
:źródło
Python/bltinmodule.c
- dodałem go do powyższego.Wiem, że to stare, ale pomyślałem, że pomocne może być pokazanie, jak te funkcje wyglądają w kodzie. To naprawdę ilustruje logikę, lepszą niż tekst lub tabela IMO. W rzeczywistości są one implementowane w języku C zamiast w czystym Pythonie, ale są one równoważne.
W szczególności widać, że wynik dla pustych iteracji jest tylko wynikiem naturalnym, a nie szczególnym przypadkiem. Możesz również zobaczyć zachowanie zwarciowe; byłoby więcej pracy, żeby nie doszło do zwarcia.
Kiedy Guido van Rossum (twórca Pythona) po raz pierwszy zaproponował dodanie
any()
iall()
wyjaśnił je, zamieszczając dokładnie powyższe fragmenty kodu.źródło
Kod, o który pytasz, pochodzi z mojej odpowiedzi podanej tutaj . Miało to rozwiązać problem porównywania wielu tablic bitowych - tj. Kolekcji
1
i0
.any
iall
są przydatne, gdy można polegać na „prawdziwości” wartości - tj. ich wartości w kontekście logicznym. 1 oznacza,True
a 0 oznaczaFalse
wygodę, którą wykorzystała ta odpowiedź. Zdarza się też, że 5True
, więc kiedy to połączysz z możliwymi wejściami ... no cóż. Nie działaZamiast tego możesz zrobić coś takiego:
Brakuje mu estetyki poprzedniej odpowiedzi ( naprawdę podobał mi się wygląd
any(x) and not all(x)
), ale wykonuje zadanie.źródło
True
kiedy wartości są różne, długość zestawu powinna wynosić 2, a nie 1.źródło
źródło
Pomysł jest prosty:
źródło
źródło