если elif с последовательностями

Я - рефакторинг некоторые сценарии, у которых есть связка кода с подобным это:

if 'mString1' in mStrVar:
    retVal = 1
elif 'mString2' in mStrVar:
    retVal = 2
elif 'mString3' in mStrVar:
    retVal = 3
elif 'mString4' in mStrVar:
    retVal = 4
else:
    retVal = 0

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

действительно ли возможно переписать это более коротким способом? mString обходит mString10 в некоторых случаях.

Любые намеки высоко ценили, и извинения, если это - дублированный, я не мог бы счесть вопрос связанным.

0
Каков точно ваш вопрос? Что mStrVar ?
добавлено автор Anony-Mousse, источник
Что, если mStrVar = "mString1mString2mString3mString4" ? По моему скромному мнению, сама логика отображения подстрок к единственному числу уже хрупка.
добавлено автор Anony-Mousse, источник
Кроме того, соответствие с регулярными выражениями может быть немного более явным, и может быть в состоянии извлечь соответствующую строку в единственном проходе по последовательности.
добавлено автор Anony-Mousse, источник
Какой don' t вы любят приблизительно этот код?
добавлено автор David Heffernan, источник
mString1 находится в mString10 , таким образом, you' d должен быть осторожен относительно заказа, если вы используете этот метод (самый длинный первый, должен работать, я думаю, но я haven' t, учитывая его очень думал.)
добавлено автор DSM, источник
Согласованный, но я don' t управляют входом в этом случае mStrVar . Это передается другой системой. Мы должны предположить, что mString s взаимоисключающий.
добавлено автор rhormaza, источник
@DavidHeffernan хорошо, это немного долго, просто ищет более короткую альтернативу, если это возможно.
добавлено автор rhormaza, источник
@DSM, совершенно правильный об этом.
добавлено автор rhormaza, источник

5 ответы

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

retVal_mapping = [
   ('mString1', 1),
   ('mString2', 2),
   ('mString3', 2),
   ('mString4', 2),
   ('', 0) # default as "'' in anyString" is always true.
]

for s, retVal in retVal_mapping:
    if s in mStrVar:
        break

# retVal now contains the right value
1
добавлено

Если вы, например, использовали бы регулярное выражение mString (\d +) , можно сделать это:

# Precompile pattern into finite automaton:
_pattern = re.compile(r'mString(\d+)')

# Apply multiple times.
match = _pattern.match(mStrVar)
if match:
    retVal = int(match.group(1))
else:
    retVal = 0

Проблема с вашим кодом подстроки выше состоит в том, что он очень хорошо не определяется если, например. mStrVar = "mString1mString2mString3mString4" . Регулярное выражение, соответствующее, на самом деле намного более строго, который может быть желаем.

Можно сделать dict подход стиля, также, для нечисловых образцов:

# Precompile pattern:
_pattern = re.compile(r'(abc|def|ghi)')
_map = { 'def' : 1, 'ghi' : 2, 'abc' : 3 }

match = _pattern.match(mStrVar)
if match:
    retVal = _map.get(match.group(1), 0)
else:
    retVal = 0

в некоторых случаях можно просто использовать dict сразу же, также:

_map = { 'def' : 1, 'ghi' : 2, 'abc' : 3 }
retVal = _map.get(mStrVar, 0) # 0 is default!
0
добавлено
retval, = [i for i in xrange(1, 5) if 'mString%s' % i in mStrVar] or [0]
0
добавлено
some_dict = dict(mString1=1, mString2=2, mString3=3)
return some_dict.get(string_value, 0)

Где string_value - один из mString1, mString2, mString3.

0
добавлено
Это не эквивалентно оригинальному коду, если больше чем одно из условий может быть найдено в mStrVar .
добавлено автор Tim Pietzcker, источник
Если не в mStrVal это возвратится 0.
добавлено автор UnLiMiTeD, источник
вы забыли проверять, является ли mStringN в mStrVar
добавлено автор rhormaza, источник
mylist = ['mString1', 'mString2', 'mString3', 'mString4']
retVal = [i for i in range(len(mylist)) if mylist[i] = mStrVar][0] + 1
0
добавлено
Python
Python
7 654 участник(ов)

Уютный чат для профессионалов, занимающихся поиском питоньих мудростей. Как не получить бан: https://t.me/ru_python/577926

Python beginners
Python beginners
4 449 участник(ов)

Вопросы про Python для чайников. Cпам и троллинг неприемлем. Не злоупотребляйте стикерами. Частозадаваемые вопросы: https://github.com/ru-python-beginners/faq/blob/master/README.md Статистика тут: https://grstats.me/chat/x4qym2k5uvfkr3al6at7

pro.python
pro.python
1 090 участник(ов)

Сообщество разработчиков под Python Создатель: @rodgelius

Rude Python
Rude Python
971 участник(ов)

Python без „девочек”, здесь матерятся и унижают Django. Not gay friendly. Правила: t.me/rudepython/114107 @rudepython | t.me/rudepython

rupython
rupython
509 участник(ов)

Группа создана с целью оперативного получения ответов на возникающие вопросы по разработке на яп python, смежные темы, а также человеческого общения. Приветствую!

Python-programming
Python-programming
266 участник(ов)

Чат группы вконтакте https://vk.com/python_community