我正在重构一些带有大量代码的脚本:
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
。
任何提示都受到高度赞赏,如果这是一个重复的道歉,我找不到任何相关的问题。
答案 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]