python:Map是如何工作的

我有一行代码是:

1
2
3
4
D = {'h' : 'hh' , 'e' : 'ee'}
str = 'hello'
data = ''.join(map(lambda x:D.get(x,x),str))
print data

这给出了一个输出-> hheello

我试图理解map函数是如何工作的。地图取每个字符的将字符串与dictionary key进行比较,并返回相应的key值?

它是如何处理这里的每个字符的?没有迭代。有没有更好地理解这一点的好例子?


Map只是将该函数应用于列表中的每一项。例如,

1
map(lambda x: 10*x, [1,2,3,4])

给了

1
[10, 20, 30, 40]

没有循环,因为map需要一个"iterable"(即可以在其上进行迭代的对象)并执行循环本身。

map,如果不是原生的,可以实现为:

1
2
def map(f, it):
    return [f(x) for x in it]

或者,更明确地说,如:

1
2
3
4
5
def map(f, it):
    result = []
    for x in it:
        result.append(f(x))
    return result

在Python中,字符串是可迭代的,并且在迭代时对字符串中的字符进行循环。例如

1
map(ord,"hello")

返回

1
[104, 101, 108, 108, 111]

因为这些是字符串中字符的字符代码。


一般来说,map操作是这样工作的:

MAP (f,L) returns L'

Input:

L is a list of n elements [ e1 , e2 , ... , en ]
f is a function

Output

L' is the list L after the application of f to each element individually: [ f(e1) , f(e2) , ... , f(en) ]

所以,在您的例子中,join操作,它对列表进行操作,以空字符串开始,并重复连接以以下方式获得的每个元素e:

Take a character x from str; return D.get(x,x)

请注意,上面(这是map操作的解释)将分别给出'hh'和'ee',并输入'h'和'e',而其他字符将保持原样。


它采用str的各个元素。下面是相同实现的可读代码:

1
2
3
4
5
6
7
8
9
10
D = { 'h' : 'hh' , 'e' : 'ee'}
str = 'hello'
returns = []  # create list for storing return value from function
def myLambda(x): # function does lambda
    return D.get(x,x)

for x in str: #map==> pass iterable
    returns.append(myLambda(x)) #for each element get equivalent string from dictionary and append to list

print ''.join(returns) #join for showing result

由于str是一个字符串,map()将把这个函数(在本例中是lambda)应用到字符串的每一项。[map()][2]处理迭代器和序列,所以它可以在字符串中工作,因为字符串是序列。

试试这个,你就会明白了:

1
2
3
str2 ="123"
print map(int, str2)
>>> [1, 2, 3]

在这种情况下,您将str2中的每个字母转换为int:

1
2
3
int("1") -> 1
int("2") -> 2
int("3") -> 3

然后以list的形式返回:

1
[1, 2, 3]

注意:不要使用Python内置的名称作为变量的名称。不要使用str作为变量的名称,因为您隐藏了它的内置实现。使用str1my_strs…代替。