Подтвердить что ты не робот

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

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

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?

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

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 и т.д. должны быть хешируемыми.

Ответ 3

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

Ответ 4

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

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