如果elif有字符串

时间:2013-01-29 12:09:48

标签: python string python-2.7

我正在重构一些带有大量代码的脚本:

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()方法,但在这种具体情况下,我认为,我不能这样做。

是否有可能以更短的方式重写它? <{1}}在某些情况下会mString

任何提示都受到高度赞赏,如果这是一个重复的道歉,我找不到任何相关的问题。

5 个答案:

答案 0 :(得分:1)

您可以创建映射列表并使用plain for循环来搜索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 :(得分:0)

如果你想使用正则表达式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!

答案 2 :(得分:0)

some_dict = dict(mString1=1, mString2=2, mString3=3)
return some_dict.get(string_value, 0)

其中string_value是mString1,mString2,mString3之一。

答案 3 :(得分:0)

mylist = ['mString1', 'mString2', 'mString3', 'mString4']
retVal = [i for i in range(len(mylist)) if mylist[i] = mStrVar][0] + 1

答案 4 :(得分:0)

retval, = [i for i in xrange(1, 5) if 'mString%s' % i in mStrVar] or [0]