我无法将自己的想法包含在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)))
行的返回类型。
是字符串列表还是其他字符串?
答案 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]
在这里,您可以获得两者的好处:一切都以简洁的方式,但易于理解,因为它是必要的代码而不是功能。