2017-01-17 3 views
6
l = ["a", "b", "c", "d", "e"] 
if "a" in l and "b" in l and "c" in l and "d" in l: 
    pass 

Что представляет собой более короткий способ написания этого заявления if?Более короткий способ операторов if на python

Пробовал:

if ("a" and "b" and "c" and "d") in l: 
    pass 

Но это кажется неправильным. Каков правильный путь? Python 3

+4

Слышала о '' all' и any'? –

+4

Обратите внимание, что второй фрагмент оценивается как 'if" a "in l:'. – jonrsharpe

ответ

11

идея может быть использовать all(..) и генератор:

if all(x in l for x in ['a','b','c','d']): 
    pass 

Все принимает в качестве входных данных любого типа итератора и проверяет, что для всех элементов Iterable излучает, bool(..) является True.

В настоящее время в пределах all используется генератор. Генератор работает как:

<expr> for <var> in <other-iterable> 

(без скобок)

Таким образом, она принимает каждый элемент в <other-iterable> и вызывает <expr> на нем. В этом случае <expr> является x in l и x является <var>:

#   <var> 
#   | 
x in l for x in ['a','b','c','d'] 
#\----/   \---------------/ 
#<expr>   <other-iterable> 

Дальнейшее объяснение generators.

+3

Очень чистое объяснение –

+1

@MoinuddinQuadri: спасибо за ваш добрый комментарий :). –

5
l = "abcde" 
if all(c in l for c in "abcd"): 
    pass 
+2

Я думаю, что OP дает пример здесь с односимвольными строками, видимо, в реальной жизни, вероятно, проверяется на несколько символов, но хороший ответ тем не менее. –

6

Вы можете использовать наборы:

l = { 'a', 'b', 'c', 'd', 'e' } 

if { 'a', 'b', 'c', 'd' } <= l: 
    pass 
4

Другой подход с использованием наборов:

l = ['a', 'b', 'c', 'd', 'e'] 
if set(['a', 'b', 'c', 'd']).issubset(set(l)): 
    pass 
Смежные вопросы