본문 바로가기

코딩/Algorithm, 자료구조

[Python/파이썬]map, filter, list comprehension

반응형

 

※ 이 글의 작성자는 SW 비전공자입니다. 

※ 개인적으로 공부하고 있는 내용을 정리하고 있는 글로 잘못 된 부분이 있다면 댓글을 남겨주세요.

 

 

이전편 : 2021.05.02 - [코딩/Algorithm & 코딩테스트] - [Python/파이썬]Indent, Naming, Type hint


 

  파이썬 알고리즘 인터뷰 책을 보고 쓰는 포스팅 2편. 이번편에서는 map, filter, list comprehesion에 대해 정리한다.

map, filter를 알기 전에 lambda를 먼저 이해해야해서 정리해보았다.

 

 

1. lambda

 

  -. 이름 없는 함수 정의(def와 다름)

  -. 람다함수의 장점은 코드가 간결하고 메모리가 절약 된다고 함(메모리가 절약되는 부분은 나중에 다시 확인예정)

  -. 내가 참고하는 자료에는 def 를 사용하는 함수 정의법은 리터럴 표기법이라고 하는데

      이 부분은 리터럴(literal), 제네레이터(generator)를 묶어서 따로 공부 및 포스팅 예정

 

 

  -.  먼저 lambda를 설명하기 전에 리터럴 표기법인 def를 사용해서 곱셈 함수 정의

 

 

<코드>

def multiple(x,y):
    return x*y

print("함수 사용 결과:", multiple(10,20))

 

함수 사용 결과: 200

 

 

-. multiple이라는 이름을 가진  함수를 사용하고 print를 통해 호출해보았다. 이 것을 lambda 표현식으로 바꾸면 아래 한줄로 표기할 수 있다. 

 


※ lamda 사용법

 

(lamda 매개변수 : 함수내용 (함수입력값)


 

<예시 코드>

lambda_test = (lambda x,y: x*y)(10,20)
print("lamda 계산식 결과", lambda_test)

 

lamda 계산식 결과 200

 

 

-. lambda x,y : x,y는 위에 multiple 함수에서 입력되는 매개변수 x,y와 동일하다.

-. x*y : 실제 함수의 내용, multiple 함수에서 return 되는 부분

 

 

 

2. map

 

-. map은 리스트나 튜플과 같은 반복 자료형을 처리해줄 수 있는 함수이다.

-. map 함수에 lambda 를 사용해서에 리스트(or 튜플)의 각 요소에 함수를 적용할 수 있음

-. map 함수는 이터레이터(iterator)라고 한다. 이터레이터는 값을 차례대로 꺼낼 수 있는 객체이다.

   (반복 가능한 객체라고 하면 리스트, 튜플등의 자료형도 해당 됨)

 

 

<예시 코드>

#map 함수를 사용하기 위한 리스트 정의
test_list = [1,2,3,4,5]

#map(리스트에 lambda 함수 적용하기)
test_map1 = map(lambda x : x*2, test_list)
print(test_map1)
print("list 사용 :", list(test_map1))

#map(range 통해 lambda 함수 적용하기)
test_map2 = map(lambda x : x**2, range(10))
print(test_map2)
print("range 사용 :", list(test_map2))

 

<map object at 0x000002994F284B08>
list 사용 : [2, 4, 6, 8, 10]

<map object at 0x000002994F284DC8>
range 사용 : [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

 

-. map 함수 ( ) 내부에 lambda 함수를 똑같이 사용. 대신 자료형은 리스트, 튜플 등 반복적인 자료형으로 입력 가능

-. map함수의 결과를 확인하려면 반드시 list, tuple 등의 자료형 형태로 변환해주어야 함.

 

 

 

3. filter

 

-. map과 같이 반복 자료형을 처리해줄 수 있음.

-. filter 이름 그대로 조건에 맞는 데이터룰 필터링하여 다른 자료형으로 만들 때 사용

-. 아래 예시 코드를 보고 이해해보자.

 

 

<예시 코드>

##map, filter 함수 실습1
test_list = [1,2,3,4,5]

test_filter = filter(lambda x : x<3, test_list)
test_map = map(lambda x : x<3, test_list)

print("filter 사용시 : ", list(test_filter))
print("map 사용시 : ", list(test_map))

 

filter 사용시 :  [1, 2]
map 사용시 :  [True, True, False, False, False]

 

-.  위 결과에서 보면 알겠지만 filter는 조건에 맞는 자료만 추려 다른 자료형으로 반환한다.

-.  map은 조건에 맞는지 True or False로 판단한 결과를 출력한다.

 

-. 참고로 map과 filter는 문자열에도 적용할 수 있다. 파이썬에서는 문자열도 한자씩 반복이 가능하다.

    아래 예시 코드를 보자.

 

 

<예시 코드>

##map, filter 문자열 적용
test_str = "ABCDE"

test_map = map(lambda x : x.lower(), test_str)
test_filter = filter(lambda x : x.lower(), test_str

print("문자열 filter :", list(test_map))
print("문자열 map :", list(test_filter))

 

문자열 filter : ['a', 'b', 'c', 'd', 'e']
문자열 map : ['A', 'B', 'C', 'D', 'E']

 

-. lower( )함수의 경우 문자열 처리 함수로 영문 대문자를 소문자로 변경하여 준다.

-. 결과에서 보면 알겠지만 문자열을 개별적으로 분리하여 자료형으로 반환하였다.(위 코드는 리스트로)

 

 

 

4.  List comprehension

 

-. 리스트를 쉽게 이해할 수 있도록, 한 줄로 표현 한 파이썬의 문법 형식

-. 기존 리스트를 기반으로 새로운 리스트를 만들어내는 구문

-. 위에서 map, filter를 통해 리스트화시켰던 부분들은 리스트 컴프리헨션 구문으로 모두 표현가능하다.

   (map, filter를 사용하는 것보다 가독성이 높아 파이썬다운 코드라고 한다.)

-. 파이썬의 2.7 버전 이후에는 리스트 외에도 딕셔너리 등도 컴프리헨션 구문 표현이 가능하다. 

   (아래 예시에선 다루진 않는다.)

 


※ 리스트 컴프리헨션 구문 사용법

 

[ 수식 for 변수 in 리스트명 ]

 


 

아래는 리스트의 각 숫자들을 *2하는 for 반복문이다.

 

<코드>

##no list comprehesion : for loop
test_list=[1,2,3,4,5]
result = []
for i in test_list:
    result.append(i*2)
print("for loop:",result)

 

for loop: [2, 4, 6, 8, 10]

 

 

1) 위 코드를 리스트 컴프리헨션 구문으로 바꿀경우 예시

 

 

<코드>

test_list = [1,2,3,4,5]

##list comprehension
lc = [x*2 for x in test_list]

 

for loop: [2, 4, 6, 8, 10]

 

 

2) list의 요소가 문자열인 경우 예시

 

 

<코드>

test_list = ['AB','Cd','Ef','GG','GASDF']

##문자열 list comprehension(모두 소문자로 바꿔 리스트화하기)
test_str = [x.lower() for x in test_list]
print("결과:", test_str)

 

결과: ['ab', 'cd', 'ef', 'gg', 'gasdf']

 

 

3) list가 아닌 문자열인 경우에도 아래와 같이 컴프리헨션 구문 사용 가능

 

 

-. 결과는 리스트로 출력된다.

 

<코드>

word = 'ABCDEFGH'
double_word = [i * 3 for i in word]
print("결과:", double_word)

 

결과: ['AAA', 'BBB', 'CCC', 'DDD', 'EEE', 'FFF', 'GGG', 'HHH']

 

 

4) 리스트 컴프리헨션에 조건을 달경우(filter와 동일)

 

 

-. 짝수인 경우만 추려 다시 리스트로 만드는 구문이다.

 

<코드>

test_list = [1,2,3,4,5,6,7,8,9,10]

#list comprehension -filter
lc_test = [i for i in test_list if i % 2 == 0]
print("결과:", lc_test)

 

결과: [2, 4, 6, 8, 10]

 

 

5) 조건이 2개이상 있을 경우

 

 

-. 표현식1 : if문 2개 사용, 가독성을 위해 2번째 조건문을 다음줄로 넘김.

 

<코드>

test_list = [1,2,3,4,5,6,7,8,9,10]
test_lc2 = [i for i in range(0,11) if i % 2 == 0
                                   if i % 5 == 0]

print("결과:", test_lc2)

 

결과: [0, 10]

 

-. 표현식2 : and 사용

 

<코드>

test_list = [1,2,3,4,5,6,7,8,9,10]
test_lc3 = [i for i in range(0,11) if i % 2 == 0 and i % 5 == 0]
                          
print("결과:", test_lc3)

 

결과: [0, 10]

 


참고링크

 

1. 리스트 컴프리헨션 : shoark7.github.io/programming/python/about-list-comprehension-python

2. 람다 함수 : wikidocs.net/22804

728x90