Проверьте, все ли значения в итерируемой форме на питоне
В настоящее время я делаю это:
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
?
Ответы
Ответ 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