#python
#python
Вопрос:
У меня есть список допустимых слов:
legal = ['osama','bin','laden']
Функция принимает список, который должен содержать слова из допустимого списка, и возвращает true, если каждый элемент списка является допустимым словом.
def is_legal( list ):
return not any( [tok not in legal for tok in list ] )
Ответ №1:
Его легче читать, если вы используете all()
вместо any()
:
legal = set(['osama','bin','laden'])
def is_legal(seq):
return all(tok in legal for tok in seq)
Комментарии:
1. Согласитесь, это гораздо более читабельно. Стоит отметить, что
all()
будет выполняться итерация по всей последовательности (seq
), тогда какany()
прекратит итерацию, когда встретит значение True (или эквивалентное). Насколько это важно, я думаю, зависит от вероятного размера тестируемой последовательности.2. @Rob:
all()
прекратит выполнение итерации, как только увидитFalse
, что по сути эквивалентно поведениюany()
.3. Ха, конечно, так и будет; Мой быстрый тестовый код был ошибочным, и я явно не думал 🙂
Ответ №2:
Вам не нужны квадратные скобки (поскольку они заставляют создавать список), и вы не хотите скрывать встроенные элементы, но да.
def is_legal(seq):
return not any(tok not in legal for tok in seq)
Комментарии:
1. Также это может быть
return all((token in legal) for token in list)
2. Однако это не совсем синоним, поскольку
list
,tuple
и строки — это все последовательности.
Ответ №3:
all((token in LEGAL_TOKENS) for token in mySequence)
Ответ №4:
Я предпочитаю:
legal = {'osama','bin','laden'} # or set(['osama','bin','laden']) if not 2.7
is_legal = legal.issuperset