2010-09-22 3 views
1

Я пишу оператор if в Python с большим количеством условий OR. Есть ли элегантный способ сделать это со списком, находящимся внутри условия, а не перебирать список?Условия записи на основе списка

Другими словами, было бы красивее, чем следующее:

if foo == 'a' or foo == 'b' or foo == 'c' or foo == 'd': 

Я только что на Python, и язык есть я хотел писать лучше.

ответ

7
if foo in ('a', 'b', 'c', 'd'): 
    #... 

Я также отметить, что ваш ответ неверен по нескольким причинам:

  1. Вы должны удалить скобки .. питон действительно нужны внешние из них, и это занимает комнату.
  2. Вы используете оператор присваивания, а не оператор равенства (=, not ==)
  3. Что вы хотели написать как foo == 'a' или foo == 'b' или ..., что вы писали не совсем правильно.
+0

Спасибо! Кроме того, вы совершенно правы в своей ошибке. Оператор назначения был честной ошибкой, другие хорошо знают. –

+1

Я полностью не согласен с '# 1'. Удаление скобок, поскольку она занимает 2 символа, НЕ является хорошей идеей. Если это упрощает чтение, сделайте это – Falmarri

+1

@Falmarri - Добавленные символы - это ненужные шумы, которые уменьшают читаемость. Мне еще нужно увидеть if (...): это проще читать из-за круглых скобок –

2
if foo in ("a", "b", "c", "d"): 

in, конечно, работает для большинства контейнеров. Вы можете проверить, содержит ли строка подстроку ("foo" in "foobar"), или если файл содержит определенный ключ ("a" in {"a": "b"}) или многие другие подобные вещи.

+0

бить меня на 1 секунду! –

+0

@Mike: Я забыл ':' хотя, возможно, это имело значение! –

1
>>> foo = 6 
>>> my_list = list(range(10)) 
>>> my_list 
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 
>>> print any(foo == x for x in my_list) 
True 
>>> my_list = list(range(0)) 
>>> print any(foo == x for x in my_list) 
False 

В качестве альтернативы:

>>> foo = 6 
>>> my_list = set(range(10)) 
>>> foo in my_list 
True 
>>> my_list = set(range(0)) 
>>> foo in my_list 
False 
2
checking_set = set(("a", "b", "c", "d")) # initialisation; do this once 

if foo in checking_set: # when you need it 

Преимущества: (1) дают набор допустимых значений имя (2) может быть быстрее, если число записей велико

Редактировать некоторые тайминги в ответ на "Обычно гораздо медленнее", когда только "несколько записей" комментарий:

>python -mtimeit -s"ctnr=('a','b','c','d')" "'a' in ctnr" 
10000000 loops, best of 3: 0.148 usec per loop 

>python -mtimeit -s"ctnr=('a','b','c','d')" "'d' in ctnr" 
1000000 loops, best of 3: 0.249 usec per loop 

>python -mtimeit -s"ctnr=('a','b','c','d')" "'x' in ctnr" 
1000000 loops, best of 3: 0.29 usec per loop 

>python -mtimeit -s"ctnr=set(('a','b','c','d'))" "'a' in ctnr" 
10000000 loops, best of 3: 0.157 usec per loop 

>python -mtimeit -s"ctnr=set(('a','b','c','d'))" "'d' in ctnr" 
10000000 loops, best of 3: 0.158 usec per loop 

>python -mtimeit -s"ctnr=set(('a','b','c','d'))" "'x' in ctnr" 
10000000 loops, best of 3: 0.159 usec per loop 

(Python 2.7, Windows XP)

+2

, конечно, это обычно намного медленнее, когда количество элементов несколько. –

+1

@Mike Axiak: я отредактировал свой ответ, чтобы показать некоторые тайминги ... что основы для вашего утверждения? –

+0

Как ни странно, новый синтаксис набора в python 2.7 "ctnr = {'a', 'b', 'c', 'd'}" выглядит немного медленнее, чем старый синтаксис на моем Windows XP. –

Смежные вопросы