в списке VS в состоянии кортежа в Python - PullRequest
2 голосов
/ 29 апреля 2019

Я хочу знать, каковы наилучшие практики использования условий in tuple и in list, и знать почему, как в следующем сценарии:

my_variable = 'A'
if my_variable in [2, 'A', None]:
    return True
elif my_variable in (2, 'A', None):
    return True

И, если возможно, перечислить преимущества / недостаткикортежей / списков в этом случае.

Ответы [ 3 ]

2 голосов
/ 29 апреля 2019

list и tuple оба имеют O (n) сложность времени для x in container проверок.

Однако, set имеют O (1) для этой проверки (большую часть временив худшем случае сложность будет хуже из-за коллизий хешей)1012 *

0.08769642199999961
0.09637485699999981
9.329999999252436e-07
0 голосов
/ 29 апреля 2019

Разница во времени выполнения незначительна между List, Tuple и Set, если есть только 3 элемента.

Руководство по стилю Pep8 ничего не говорит об этом, насколько мне известно, поэтому вы можете использовать любое, что пожелаете.

Что-то, что другие ответы пропустили, что касается читабельности, это выможет объявить набор прямо так:

if my_variable in {2, 'A', None}:
    print(True)
0 голосов
/ 29 апреля 2019

A tuple является неизменяемой последовательностью, тогда как list является изменяемой последовательностью, что означает, что кортежи не могут быть изменены, но список может быть.

Если вы не хотите изменять проверяемую структуру данных in, используйте tuple, в противном случае используйте список, в противном случае оба будут вести себя одинаково.

my_variable = 'A'

if my_variable in [2, 'A', None]:
    print(True)
if my_variable in (2, 'A', None):
    print(True)

Выход будет

True
True

Обратите внимание, что и список, и кортеж имеют O(n) сложность по времени для проверки, чтобы получить среднюю O(1) сложность, используйте набор.

if my_variable in set([2, 'A', None]):
    print(True)
#True
...