Pytanie Sprawdź, czy predykat sprawdza wartość true dla wszystkich elementów w wersji iterowalnej w Pythonie


Jestem pewien, że istnieje wspólny język, ale nie mogłem go znaleźć w wyszukiwarce Google ...

Oto, co chcę zrobić (w Javie):

// Applies the predicate to all elements of the iterable, and returns
// true if all evaluated to true, otherwise false
boolean allTrue = Iterables.all(someIterable, somePredicate);

Jak to się robi "Pythonic" w Pythonie?

Byłoby wspaniale, gdybym mógł uzyskać odpowiedź również:

// Returns true if any of the elements return true for the predicate
boolean anyTrue = Iterables.any(someIterable, somePredicate);

32
2018-03-07 08:36


pochodzenie




Odpowiedzi:


Czy masz na myśli coś takiego:

allTrue = all(somePredicate(elem) for elem in someIterable)
anyTrue = any(somePredicate(elem) for elem in someIterable)

61
2018-03-07 08:41



Te formy mają również zaletę "zwarcia": all zakończy się na pierwszym False występowanie, oraz any zakończy się na pierwszym True występowanie. - Don O'Donnell
Czy jestem jedynym, który uważa, że ​​jest to niedopuszczalnie szczegółowe dla tak powszechnej operacji? - cic
Witamy w Python @ cic. : D Jest kokos, który jest bardziej podatny na FP kokosowy-lang.org - Ezekiel Victor


allTrue = all(map(predicate, iterable))
anyTrue = any(map(predicate, iterable))

6
2018-03-07 08:42



To spowoduje dwukrotne powtórzenie sekwencji ... - Felix Kling
Aby użyć tu zwarcia, możesz wymienić map z itertools.imap. - Björn Pollex
@ Space_C0wb0y - w Pythonie 3 mapa zwraca iterator, a nie listę, więc imap nie byłby już potrzebny. - PaulMcG


Oto przykład, który sprawdza, czy lista zawiera wszystkie zera:

x = [0, 0, 0]
all(map(lambda v: v==0, x))
# Evaluates to True

x = [0, 1, 0]
all(map(lambda v: v==0, x))
# Evaluates to False

Alternatywnie możesz również:

all(v == 0 for v in x)

1
2018-03-07 20:37





Możesz użyć "wszystkich" i "dowolnych" wbudowanych funkcji w Pythonie:

all(map(somePredicate, somIterable))

Tutaj somePredicate jest funkcją i all sprawdzi, czy bool () tego elementu ma wartość True.


0
2018-03-07 08:53



Jeśli używasz Pythona 2, bo się spętałeś map i all, to w najgorszym przypadku ma złożoność czasu O (2n). Nie polecałbym tego, chyba że twoja iteracja jest bardzo mała. ... Jeśli używasz Pythona 3, map zwraca wartość iterowalną, więc nie stanowi problemu. - mklbtz