2013-07-24 15 views
13
>>> l = list(range(10)) 
>>> l 
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 
>>> if filter(lambda x: x > 10, l): 
...  print "foo" 
... else:      # the list will be empty, so bar will be printed 
...  print "bar" 
... 
bar 

Chciałbym użyć zamiast tego any(), ale any() przyjmuje tylko jeden argument: iterowalny. Czy istnieje lepszy sposób?Jak uzyskać dowolne() z pythona z niestandardowym predykatem?

Odpowiedz

23

Użyj generator expression jak tego jednego argumentu:

any(x > 10 for x in l) 

Tutaj orzecznikiem jest w oku ekspresji wyrazu prądnicy, ale można użyć dowolnego wyrażenia tam, w tym przy użyciu funkcji.

Demo:

>>> l = range(10) 
>>> any(x > 10 for x in l) 
False 
>>> l = range(20) 
>>> any(x > 10 for x in l) 
True 

Wyrażenie generator należy powtórzyć na any() znajdzie True wynik i dalej:

>>> from itertools import count 
>>> endless_counter = count() 
>>> any(x > 10 for x in endless_counter) 
True 
>>> # endless_counter last yielded 11, the first value over 10: 
... 
>>> next(endless_counter) 
12 
6

użycie wyrażenia generującego wewnątrz any():

pred = lambda x: x > 10 
if any(pred(i) for i in l): 
    print "foo" 
else: 
    print "bar" 

Zakłada to, że masz już pewną funkcję predykatu, z której chcesz skorzystać, oczywiście jeśli jest to coś prostego, możesz użyć bezpośrednio wyrażenia Boolean: any(i > 10 for i in l).

Powiązane problemy