什么信息存储在python地图对象中?

时间:2017-05-29 11:55:46

标签: list python-3.x

我无法将自己的想法包含在map()函数中。 我从example获取了代码。 我想知道这行代码到底发生了什么。

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']

我知道如果我map(os.path.split,map(os.path.dirname, labels[0]))我得到的值clapton

但我可以使用其他一些逻辑来转换此地图。什么是labels=map(itemgetter(1),map(os.path.split,map(os.path.dirname,labels)))行的返回类型。

是字符串列表还是其他字符串?

1 个答案:

答案 0 :(得分:3)

采用以下map的纯Python实现:

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

这基本上是内置的map,只是在本机代码中,所以速度要快得多。

所以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)

将这些函数调用正确链接使得这已经更清楚了,这使我们可以轻松猜出组合函数的作用:在这种情况下,它获取传递的标签的目录(这是一个路径),然后拆分那个,只获得目录的名称。也可以在此处使用os.path.basename,而不是手动拆分路径。

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

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

在这里,您可以获得两者的好处:一切都以简洁的方式,但易于理解,因为它是必要的代码而不是功能。