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を使用する
- line'ではない「XYZ」は、よりニシキヘビである場合にのみ封じ込めを確認したいと使用しない場合は'インデックス... –
@JonClements right!私はあなたの提案を追加しました – shx2
あなたの入力をありがとう、これは素晴らしいです。 –