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
'Data/Text/Knowledge Analysis & Mining > Python' 카테고리의 다른 글
mongoDB, python, twitter Oauth (0) | 2013.07.25 |
---|---|
unicode, chatdet (0) | 2013.07.21 |
google app engine urlfetch, urllib2 (0) | 2013.07.16 |
python - JSON 데이타 load 하기 (0) | 2013.07.16 |
'쿵푸 팬더'의 사부는 너구리 ? (0) | 2013.06.26 |
WRITTEN BY
- manager@
Data Analysis, Text/Knowledge Mining, Python, Cloud Computing, Platform