List python映射对象中存储了哪些信息?

List python映射对象中存储了哪些信息?,list,python-3.x,List,Python 3.x,我无法集中精力在地图功能上。 我从一个数据库中获取了代码。 我想知道这行代码到底发生了什么 labels = map(itemgetter(1),map(os.path.split,map(os.path.dirname,labels))) 此语句之前的标签值为 <class 'list'>: ['classify-test/aligned/clapton/clapton-1.png', 'classify-test/aligned/clapton/clapton-2.png',

我无法集中精力在地图功能上。 我从一个数据库中获取了代码。 我想知道这行代码到底发生了什么

labels = map(itemgetter(1),map(os.path.split,map(os.path.dirname,labels))) 
此语句之前的标签值为

<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']
我知道如果我使用mapos.path.split、mapos.path.dirname和labels[0],我会得到值clapton

但是我可以用其他的逻辑来转换这张地图吗。labels=mapitemgetter1,mapos.path.split,mapos.path.dirname,labels行的返回类型是什么


它是字符串列表还是其他内容?

以下面的map纯Python实现为例:

这本质上是内置的映射,只是在本机代码中,所以速度要快得多

所以map只将作为第一个参数传递的函数应用于作为第二个参数传递的iterable的每个元素。在您的情况下,要了解发生了什么,您应该从内到外阅读这行内容:

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
由于要运行map三次,所以要在原始元素上应用三个函数。您可以将这些功能组合起来,使其更加清晰:

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

result = map(getDirectoryName, labels)
将这些函数调用正确地链接起来,这已经非常清楚了,这使我们能够轻松猜测组合函数的作用:在本例中,它获取传递的标签的目录,即路径,然后将其拆分,以仅获取目录的名称。也可以使用此处来代替手动拆分路径

因为这非常清楚,这就是为什么很少在Python代码中使用map的原因。通常首选的方法是使用列表理解:

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

这两种方法都有好处:一切都简洁明了,但易于理解,因为它是命令式代码而不是函数式代码。

以下面的map纯Python实现为例:

这本质上是内置的映射,只是在本机代码中,所以速度要快得多

所以map只将作为第一个参数传递的函数应用于作为第二个参数传递的iterable的每个元素。在您的情况下,要了解发生了什么,您应该从内到外阅读这行内容:

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
由于要运行map三次,所以要在原始元素上应用三个函数。您可以将这些功能组合起来,使其更加清晰:

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

result = map(getDirectoryName, labels)
将这些函数调用正确地链接起来,这已经非常清楚了,这使我们能够轻松猜测组合函数的作用:在本例中,它获取传递的标签的目录,即路径,然后将其拆分,以仅获取目录的名称。也可以使用此处来代替手动拆分路径

因为这非常清楚,这就是为什么很少在Python代码中使用map的原因。通常首选的方法是使用列表理解:

result = [os.path.split(os.path.dirname(label))[1] for label in labels]
在这里,两者都有好处:一切都以简洁的方式进行,但很容易理解,因为它是命令式代码而不是函数式代码