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
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

たとえば、正規表現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
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 に答える