0

我正在重构一些包含大量代码的脚本,如下所示:

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

高度赞赏任何提示,如果这是重复的,我深表歉意,我找不到任何相关的问题。

4

5 回答 5

1

您可以创建一个映射列表并使用普通的 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
于 2013-01-29T12:24:50.627 回答
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!
于 2013-01-29T12:19:21.820 回答
0
some_dict = dict(mString1=1, mString2=2, mString3=3)
return some_dict.get(string_value, 0)

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

于 2013-01-29T12:21:06.333 回答
0
mylist = ['mString1', 'mString2', 'mString3', 'mString4']
retVal = [i for i in range(len(mylist)) if mylist[i] = mStrVar][0] + 1
于 2013-01-29T12:25:48.203 回答
0
retval, = [i for i in xrange(1, 5) if 'mString%s' % i in mStrVar] or [0]
于 2013-01-29T12:29:37.153 回答