2015-05-04 5 views
2

Я пытаюсь использовать all(), но он не работает для меня:Как использовать встроенную функцию()?

>>> names = ["Rhonda", "Ryan", "Red Rackham", "Paul"] 
>>> all([name for name in names if name[0] == "R"]) 
True 
>>> 

Я пытаюсь проверить, если все имена начинаются с "R", и даже если я добавил "Paul" к names, all() еще возвращает True. Как исправить это, так что all() возвращает False до "Paul"?

+0

Что вы ожидали? – ZdaR

+1

Кроме того, строки имеют метод startswith, поэтому 'name.startswith (" R ")' работает тоже. – DSM

+1

'if all (c [0] ==" R "для c в именах):' –

ответ

8

Вы не понимаете, как работает all. Из docs:

all(iterable)

Возвращение True, если все элементы iterable являются истинными (или если iterable пуст).

В коде, вы первый сбор всех имен, которые начинаются с R в список и затем передать этот список all. Выполнение этого всегда будет возвращать True, потому что непустые строки оцениваются до True.


Вместо этого вы должны написать:

all(name[0] == "R" for name in names) 

Это пройдет Iterable из булевых в all. Если все они True, функция вернет True; в противном случае он вернется False.

В качестве дополнительного бонуса результат будет вычисляться лениво, потому что мы использовали generator expression вместо понимания списка. При понимании списка код должен был проверить все строки перед определением результата. Однако новый код будет проверять только столько, сколько необходимо.

+0

Спасибо! Я пытался поместить * оценивающий * список в «все» :) – user1823

0
names = ["Rhonda", "Ryan", "Red Rackham", "Paul"] 
print all(map(lambda name: name[0] == "R", names)) 
# prints False 
names = ["Rhonda", "Ryan", "Red Rackham"] 
print all(map(lambda name: name[0] == "R", names)) 
# prints True 
0

Причины, почему вы получали неправильный результат потому, что вы уже создаете новый список, используя список понимание, применяя желаемое состояние, поэтому, если мы делаем немного разбивки то:

>>> print [name for name in names if name[0] == "R"] 
>>> ['Rhonda', 'Ryan', 'Red Rackham'] 
>>> print all(['Rhonda', 'Ryan', 'Red Rackham']) 
>>> True 

Так правильный путь может быть:

names = ["Rhonda", "Ryan", "Red Rackham", "Paul"] 

res = all(map(lambda x : x[0]=="R", names)) 
# map() returns: [True, True, True, False] 
# all([True, True, True, False]) == False 
print res 
Смежные вопросы