python 및 머신러닝 교육, 슬로우캠퍼스


Hadoop의 map/reduce 개념도 python의 map(), reduce() 함수를 참고하지 않았을까 하는 생각을 해봅니다.


다음은 zip(), map(),  reduce(),  lambda 함수에 대한 이해를 할 수 소스 코드 입니다.


직접 입력하면서 실행해 보세요.




python - zip()


>>> a=[1,2,3]

>>> b=[4,5,6]

>>> a+b

[1, 2, 3, 4, 5, 6]

>>> zip(a,b)

[(1, 4), (2, 5), (3, 6)]


python - generator (list)

아래와 같이 [ ]를 이용하여 list를 생성하는 것이 more pythonic 한 방식이다.

>>> a

[1, 2, 3]

>>> [ x*x for x in a]

[1, 4, 9]

>>> [ x*x for x in a if x%2 == 1]

[1, 9]



일반적인  procedural language (c, java, ...) 스타일로 하면 아래와 같다.

>>> for x in a:

...     if x%2==1:

...             print x*x

...

1

9


>>> [ x+y for x,y in zip(a,b)]

[5, 7, 9]


python - map()


>>> import operator

>>> map(operator.add, a, b)

[5, 7, 9]


>>> s1= ['abb ccc', 'tttt jjjj kkk']


>>> map(str.split, s1)

[['abb', 'ccc'], ['tttt', 'jjjj', 'kkk']]


>>> [s.split()  for s in s1]

[['abb', 'ccc'], ['tttt', 'jjjj', 'kkk']]


>>> [s.split('b')  for s in s1]

[['a', '', ' ccc'], ['tttt jjjj kkk']]


python - lambda 를 이용한 간단한 함수 정의 (anonymous function)


>>> map(str.split('b'), s1)

Traceback (most recent call last):

 File "<stdin>", line 1, in <module>

TypeError: 'list' object is not callable


>>> map(lambda x: x.split('b'), s1)

[['a', '', ' ccc'], ['tttt jjjj kkk']]


>>> map(lamdba x,y: x*x+y*y , a, b)

 File "<stdin>", line 1

   map(lamdba x,y: x*x+y*y , a, b)       <--- 오타   lamdba

            ^

SyntaxError: invalid syntax


>>> map(lambda x,y: x*x+y*y , a, b)

[17, 29, 45]



>>> import math

>>> map(lambda x,y: math.sqrt(x*x+y*y) , a, b)

[4.123105625617661, 5.385164807134504, 6.708203932499369]


python - reduce()

>>> k = range(10)

>>> k

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]


>>> import operator

>>> reduce(operator.add, k)

45 ---> 더하기


>>> reduce(lambda x: x*x, k)

Traceback (most recent call last):

 File "<stdin>", line 1, in <module>

TypeError: <lambda>() takes exactly 1 argument (2 given)

---> 함수 호출에서 "takes exactly n argument " 라는 오류는 함수의 인자(argument) 개수가 잘못되었을 때 발생한다.


reduce()의 첫번째 인자는 2개의 argument를 받는 함수이여야 하는데, lambda로 인자 1개 짜리 함수를 정의하여서 오류(exception) 발생한 것이다.



>>> reduce(lambda x,y: x*x, k)

0

>>> reduce(lambda x,y: y*y, k)

81

>>> reduce(lambda x,y: x+y*y, k)

285




>>> def see(x,y):

...     print x,y,'->', x+y*y

...     return x+y*y

...

>>> reduce(see, k) --> reduce() 실행 과정을 보기 위해 print

1 2 -> 5

5 3 -> 14

14 4 -> 30

30 5 -> 55

55 6 -> 91

91 7 -> 140

140 8 -> 204

204 9 -> 285

285



>>> reduce(lambda x,y: x*x+y*y, k)

160623854392948285208011982134507489923477046669785452499236264188406112786126885439804859615624545L




WRITTEN BY
manager@
Data Analysis, Text/Knowledge Mining, Python, Cloud Computing, Platform

,