2016-12-26 12 views
0

の値を0または1に置き換えたい場合は、いくつかの外部条件によって異なります。私の解決策は次のとおりです:リストを2つの値で置き換えます

my_list = [3, 4, 5, None, 6, 7, None, 8, None] 
my_list = [(1 if external_string == "ONE" else 0) if v is None else v for v in my_list] 

これは問題を解決するためのpythonicな方法ですか? external_string"ZERO"の場合は0、そうでない場合はexternal_stringの場合は"ONE"の場合は2、external_stringの場合は2、そうでない場合は2を超える文字列の値を持つ可能性があります。この場合は上のコードを記述する方法です文体的に受け入れられますか?

答えて

5

多くのオプションがexternal_stringのために存在する場合は、あなたがより良いそして、選択したすべての可能性を保持した辞書を利用します適切なexternal_stringを使用して値を置き換える:代わりに、あなたも(デフォルト)Noneを返しますdict.get()メソッドを使用することができます直接インデックスを使用しての

all_options = {'ZERO':0, 'ONE':1, 'TWO':2, 'THREE': 3} 

my_list = [all_options[external_string] if v is None else v for v in my_list] 

注場合キーが辞書に存在しないか、キーがない場合に渡すためにカスタム値を渡すことができます。

5

一度置換値を計算することができるようにexternal_stringは、ループ内で変更されませんので:

replacement = 1 if external_string == 'ONE' else 0 
my_list = [replacement if v is None else v for v in my_list] 

external_stringテストだけで関数を作成、変更またはより複雑なデータを使用している場合:

def replace(value): 
    if value is not None: 
     return value 
    return 1 if external_string == 'ONE' else 0 

my_list = [replace(v) for v in my_list] 

リストの理解にすべてを詰め込もうとしないでください。可読性は数えます!複数のオプションについて

、置換値に外部の文字列をマッピングする辞書を使用することを検討してください:

external_string_map = {'ONE': 1, 'TWO': 2} # etc. 
replacement = external_string_map.get(external_string, 0) 
my_list = [replacement if v is None else v for v in my_list] 
+1

OPがOPのように2〜3つ以上のオプションを扱っている場合、これは適切な方法ではありません。 – Kasramvd

+1

@ Kasramvd:どの時点で関数を使用しますか? –

関連する問題