2012-01-07 3 views
4

Я уверен, что есть очень простой ответ на этот вопрос, но я не могу найти его после поиска на некоторое время.Использование условий «или» in if

prefixes = "JKLMNOPQ" 
suffix = "ack" 

for letter in prefixes: 
    if letter == "Q" or letter == "O": 
     print letter + "u" + suffix 
    else: 
     print letter + suffix 

Приведенный выше код работает отлично, состояние на если заявление кажется немного многословно, так что я пробовал:

if letter == "Q" or "O": 

, которая короче, но не работает. Я решил, что это не сработает, потому что «O» - это логическое выражение, которое всегда будет True и что оно не рассматривает ничего с левой стороны «или».

Я пытался ставить скобки вокруг него так:

if letter == ("Q" or "O"): 

но соответствует только Q, а не О.

Есть ли сокращенный способ получить код, чтобы работать или я должен использовать это длинный путь, который работает на меня?

+1

'("Q", или "О")' является то же, что и 'Q' – onemach

+2

Языки программирования - это * формальные языки * со строго определенным значением любого синтаксиса. Обычно вы не можете просто решить, что данное выражение выглядит «длинным ветром» и попробуйте сократить его, как и на английском. ** ** подходит для просмотра кода, который вы пишете, и задаетесь вопросом, существуют ли более короткие или более четкие способы его написания, особенно во время обучения. Но вам нужно сделать это с пониманием *, а не просто попробовать случайные варианты и посмотреть, работают ли они. Худший результат, который вы можете получить, заключается в том, что он работает **, потому что он будет работать случайно и может быть неудачным в следующий раз! – Ben

ответ

4

Вы можете использовать letter in 'OQ' или re.match('[OQ]', letter)

Более подробно, я бы, вероятно, определить строку префиксов, которые должны получить «и».

prefixes = 'JKLMNOPQ' 
prefixes_taking_u = 'OQ' 
suffix = 'ack' 
for p in prefixes: 
    u_part = 'u' if p in prefixes_taking_u else '' 
    print p + u_part + suffix 

В коде letter == ("O" or "Q") первая оценивает ("O" or "Q") («O» не является ложным, так что результат «O») и так это то же самое, как letter == "O".

Ваша другая попытка, letter == "O" or "Q" сначала оценивает letter == "O", и если она истинна, она дает ответ True, иначе она даст ответ «Q».

Вы можете найти документацию для того, как or работает в language reference.

+0

+1 для объяснения, почему решения ПО не работали – gecco

+0

Спасибо, что объяснили, что теперь это имеет для меня гораздо больше смысла. – FiveAlive

+1

-1 Использование 're.match' для этого - шутка. –

1
if letter in ['Q', 'O'] 

btw, лучше не сосредотачиваться на том, как вы пишете код.

8

Используйте один из следующих решений для реализации условие:

  • список: if letter in ['Q', 'O']
  • кортеж: if letter in ('Q', 'O')
  • строку : if letter in 'QO'

Update: Для полноты: Regexp: re.match('[OQ]', letter) (копируется из Paul Hankings answer(вы должны проголосовать его Anwer, если вы думаете, регулярное выражение является решением))

0

И еще один вариант (быстрее в случае, если есть много префиксы, а не только два):

prefixes = frozenset('QO') 
if letter in prefixes: 
    #... 
0

«в строке» вариант лучше, в этом частном случае, когда входной сигнал является одиночным символом.В более общем плане, для небольшого числа возможных значений «в кортеже» предпочтительнее «в списке», поскольку последние Pythons будут строить кортеж во время компиляции, тогда как список создается во время выполнения.

Когда есть много вариантов, набор или фризонсет можно построить один раз и опросить несколько раз быстро.

Подходы Regex сложнее и/или медленнее, чем варианты, описанные выше.

(1) re.match('[QO]', letter) не может конкурировать с letter in 'QO'

(2) изначально needs_u = re.compile('[QO]').match с последующим needs_u(letter) это ужасно по сравнению с начальным needs_u = set('QO') с последующим letter in needs_u

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