Проверьте, все ли значения в итерируемой форме на питоне

В настоящее время я делаю это:

if x in a and y in a and z in a and q in a and r in a and s in a: print b 

Есть ли более питонический способ выражения этого утверждения if ?

Использование всей функции позволяет написать это красивым и компактным способом:

 if all(i in a for i in (x, y, z, q, r, s)): print b 

Этот код должен делать почти то же, что и ваш пример, даже если объекты не хешируются или если у объекта есть какой-то смешной метод __contains__ . all функции также имеют аналогичное поведение короткого замыкания как цепочку and в исходной задаче. Сбор всех объектов, подлежащих тестированию в кортеже (или списке), гарантирует тот же порядок выполнения тестов, что и исходная проблема. Если вы используете набор, порядок может быть случайным.

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

 if {x, y, z, q, r, s}.issubset(a): print(b) 

Пример REPL:

 >>> {0, 1, 2}.issubset([0, 1, 2, 3]) True >>> {0, 1, 2}.issubset([1, 2, 3]) False 

Одно из предостережений при таком подходе состоит в том, что все x , y , z и т. Д. Должны быть хешируемыми.

 if all(v in a for v in {x, y, z, q, r, s}): print(b) 

Преобразование в набор:

 if len({x, y, z, q, r, s} - set(a)) == 0: print b 

или

 t = {x, y, z, q, r, s} if t & set(a) == t: print b