оператор `in` в списках или оператор` или` в нескольких условиях - python - PullRequest
1 голос
/ 04 февраля 2020

Я недавно использовал python3 для класса и понял, что вы можете написать

if x in [1,2,3]:
    print("x is 1,2 or 3")

вместо

if x == 1 or x == 2 or x ==3:
    print("x is 1,2 or 3")

Считается ли это хорошим или плохим практика, это "pythoni c"?

Редактировать

Похоже, что консенсус заключается в том, что

if x in {1,2,3}: # set {}, not list []
    print("x is 1,2 or 3")

более эффективен, O (1) по сравнению с O (n) и, следовательно, быстрее. Кроме того, он выражает те же вещи менее многословно, что делает его более «pythoni c».

Ответы [ 3 ]

5 голосов
/ 04 февраля 2020

TL; DR:

Да.

Более длинный ответ:

Это не менее эффективно, как @Selcuk упомянул в комментариях:

Разница в производительности связана с накладными расходами реализации, в противном случае они оба O(n), тогда как set операция на самом деле быстрее, чем O(1).

Слуховой набор должен сбить вас с толку сначала прочитайте все, и в конце вы увидите set тестирование членства, вот время:

from timeit import timeit
x = 2
print(timeit(lambda: x in [1, 2, 3], number=10000000))
print(timeit(lambda: x == 1 or x == 2 or x == 3, number=10000000))

Вывод:

2.9532112044043597
3.614175814476062

Так что это означает, что ваш первый Решение с проверкой членства в списке выполняется быстрее, чем несколько or условий.

Как уже упоминалось @Austin, set тестирование членства выполняется быстрее.

Так что если мы проверим set время членства, например, :

from timeit import timeit
x = 2
print(timeit(lambda: x in {1, 2, 3}, number=10000000))

Будет выведено:

2.7767165870317445

Так что set членство самое быстрое.

1 голос
/ 04 февраля 2020

Небольшая версия первой будет больше pythoni c:

if x in {1,2,3}:

Всегда проверка членства на наборе происходит с постоянным временем, хотя будет время создания набора (которое в некоторых случаях может быть узким местом).

0 голосов
/ 04 февраля 2020

Ключевое слово in имеет две цели:

  • Ключевое слово in используется для проверки наличия значения в последовательности (list, range, string et c.).

  • Ключевое слово in также используется для итерации последовательности в for
    l oop

Что касается моих знаний, "in" вызывает метод eq , чтобы проверить, соответствует ли данная запись текущему списку в этом случае, следовательно, оба достигают одного и того же. Что касается ответа на вопрос, является ли это «pythoni c», то да, функция in сохраняет несколько строк итерации, которые ранее требовались для итерации и сравнения списка или любой другой структуры данных.

Вот time сложность документации для дальнейшего использования, также объясняется временная сложность ключевого слова in, которое в среднем равно O (n)

...