Является ли этот логический тест pythonic для ограничения членов списка набором допустимых значений?

#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