2017-05-29 4 views
0

map()関数で私の心を覆すことができません。 exampleからコードを取得しました。 このコード行で何が起こっているのかを知りたいです。この文の前pythonマップオブジェクトにはどのような情報が格納されていますか?

labels = map(itemgetter(1),map(os.path.split,map(os.path.dirname,labels))) 

ラベルの値は、私は私がmap(os.path.split,map(os.path.dirname, labels[0]))をした場合、私は値claptonを取得したいことを知っている

<class 'list'>: ['classify-test/aligned/clapton/clapton-1.png', 'classify-test/aligned/clapton/clapton-2.png', 'classify-test/aligned/lennon/lennon-1.png', 'classify-test/aligned/lennon/lennon-2.png'] 

です。

しかし、私はこのマップを変換するために他のロジックを使用できますか?そして、labels=map(itemgetter(1),map(os.path.split,map(os.path.dirname,labels)))行の戻り値の型は何ですか。

それは文字列のリストですか、それとも別のものですか?

答えて

3

map次のピュアPython実装してください:

def my_map (func, iterable): 
    for item in iterable: 
     yield func(item) 

これは、本質的にビルトインされたされmapだけでネイティブコードで、ありませんので、それははるかに高速です。

したがってmapは、第2引数として渡された繰り返し可能な要素のすべての要素に最初の引数として渡された関数を適用します。あなたのケースでは、何が起こるかを理解するために、あなたは内側から外側にラインを読んでください:

map(itemgetter(1), map(os.path.split, map(os.path.dirname, labels))) 
                  ^^^^^^ 
               Start here: This is your iterable 

              ^^^^^^^^^^^^^^^ 
              Run os.path.dirname(x) on every element x 

         ^^^^^^^^^^^^^ 
         Run os.path.split(y) on every element y of the previous result 

    ^^^^^^^^^^^^^ 
    Run itemgetter(1)(z) on every element z of the previous result 

あなたは元の要素の上に3つの機能を適用している、map 3回を実行しているので。あなたはそれをもう少し明確にするためにこれらの機能を組み合わせることができますこれらの機能が適切にチェーンコールを持つ

def getDirectoryName(label): 
    return os.path.split(os.path.dirname(label))[1] 

result = map(getDirectoryName, labels) 

は、私たちは簡単に組み合わせる機能が何をするのかを推測することを可能にする、これはすでにたくさん明確になります。この場合は、それを渡されたラベル(パス)のディレクトリを取得し、それを分割してディレクトリ名だけを取得します。手動でパスを分割するのではなく、ここでos.path.basenameを使用することもできます。

これははっきりしているので、これはmapがPythonコードで使用されることはほとんどありません。しばしば好ましい方法は、リストの内包表記を使用して次のようになります。ここでは

result = [os.path.split(os.path.dirname(label))[1] for label in labels] 

を、あなたは、両方の利点を持っている:それは不可欠コードの代わりに、機能的な簡潔な方法ですべてのもの、まだ理解しやすいだから。

+0

ありがとう、読んで理解しやすくする:) –

関連する問題