2016-06-27 4 views
3

forループを使用するのではなく、次のループがmap()で実行可能かどうか分かりましたか? はいの場合は、どのように表示するために十分な親切にしてください? または 次の操作を行う最も効率的な方法は何ですか?マップとラムダを使用したPython辞書の割り当て

ABCD XYZ 
DEFG ABC 

は、キーとしての第1のワードとdicionaryを作成し、第二の値 がXYZである場合、それはそうでなければ1 0の値を割り当てます。よう

f = open('sample_list.txt').read().split('\n') 

val = lambda x: re.match('[a-zA-z0-9]+',x).group() if x else None 

for line in f: 
    if line.find('XYZ') == -1: 
     dict[val(line)]=0 
    else: 
     dict[val(line)]=1 

このプログラムは、フォーマットされたファイルを読み込みます。

すなわち辞書は次のようになります。

{'ABCD': 1, 'DEFG': 0} 

UPDATE:

私は) 辞書の理解が速くなり、それがvalのを(使用しないようarekolekのアプローチ@が何よりも道も高速ですshx2@arekolek @によって提案されたアプローチを時限ラムダ関数が宣言されました。

コード:

def a(): 
    return { 
    val(line) : 0 if line.find('XYZ') == -1 else 1 
    for line in f 
    } 

def b(): 
    return dict(map(lambda x: (x[0], int(x[1] == 'XYZ')), map(str.split, f))) 

def c(): 
    return {k: int(v == 'XYZ') for k, v in map(str.split, f)} 

print 'a='+timeit.timeit(a) 
print 'b='+timeit.timeit(b) 
print 'c='+timeit.timeit(c) 

結果:両方これを示すため

a = 13.7737597283 
b = 6.82668938135 
c = 3.98859187269 

感謝:) mapよりもdict comprehensionを使用する

答えて

1

line.find('XYZ') != -1

  • 'XYZ' in line(クレジット:boolあなたがboolのような値を残すことができれば
  • intへ:

    dict(map(lambda k, v: (k, int(v == 'XYZ')), *map(str.split, f))) 
    

    辞書読解:ここですべての `str.find`を使用する理由

    {k: int(v == 'XYZ') for k, v in map(str.split, f)} 
    
  • 4

    良いです。

    my_dict = { 
        val(line) : 0 if line.find('XYZ') == -1 else 1 
        for line in f 
    } 
    

    いくつかの注意と改善:

    は、次のように行うことができます

      1. dictはpythonで複雑な式0 if line.find('XYZ') == -1 else 1から
      2. 代替良い変数名ではありません
      3. int(line.find('XYZ') != -1)(変換中

        dict(map(lambda x: (x[0], int(x[1] == 'XYZ')), map(str.split, f))) 
        

        または:ラムダで@JonClements)

    +0

    - line'ではない「XYZ」は、よりニシキヘビである場合にのみ封じ込めを確認したいと使用しない場合は'インデックス... –

    +0

    @JonClements right!私はあなたの提案を追加しました – shx2

    +1

    あなたの入力をありがとう、これは素晴らしいです。 –

    関連する問題