3 minute read


리스트 관련 유용한 내장 함수 : map / filter / zip / reduce / enumerate

map()
  • 리스트 내 각 요소들에 동일하게 간단한 연산을 적용할 때 사용
    • 형변환 (int, string, float, …)
    • 동일한 값 뺄셈
  • 주로 이름 없는 함수인 Lambda 함수로 연산을 정의한 후 이를 각 요소에 적용하는 형태
    • 이때, lambda 함수의 인자 개수는 반드시 1개.

//map

a = [1, 2, 3, 4, 5]
print(a)

a = list(map(str, a)) //list내의 요소들 type을 str로 변환
print(a)

a = list(map(int, a)) //list내의 요소들 type을 int로 변환
print(a)

a = list(map(lambda x: x+1, a)) //list 내의 요소  1 증가
print(a)

12_map_Procdess
map() 함수 및 lambda 함수 적용



filter()
  • 리스트 내 요소들을 특정 기준으로 필터링 할때 사용
    • 즉, 특정 기준을 만족하는 요소만 추출 가능
  • lambda 함수로 filtering 기준 판단 연산을 정의 후 각 요소에 적용하도록 하는 형태.
    • lambda 함수에서 True 로 판단된 요소들만 추출.

// filter()

a = [1, 2, 3, 4, 5]
print(a)

a = list(filter(lambda x: x < 4, a)) //list a 에서 4보다 작은 요소 반환
print(a)

b = [('care', 'free', 'life'), ('free', 'life'), ('care', 'life')]
b = list(filter(lambda x: len(x) == 2, b)) //길이가 2 요소 반환  
print(b)

12_filter_Procdess
filter() 함수 및 lambda 함수 적용



zip()
  • 서로 다른 두 리스트의 동일한 index의 요소들끼리 묶어서 계산할 때 사용
// zip()
a = ['A', 'B', 'C', 'D']
b = [4.0, 3.0, 2.0, 1.0]

for ele_A, ele_B in zip(a, b):
    print(ele_A, ele_B) // 인덱스 순서로 list a  b의 요소를 동시에 출력

//  리스트의 길이가 다른 경우에는 길이가  짧은 리스트의 최대 index까지 실행.
c = [1, 2, 3, 4, 5]
d = ['1', '2', '3']
for ele_C, ele_D in zip(c, map(int, d)): // list d -> int 형변환
    print(f'ele_C({ele_C}) + ele_D({ele_D}) = {ele_C + ele_D}')

12_zip_Procdess
zip() 함수 및 lambda 함수의 적용



reduce()

from functools import reduce
  • Python 3.~ 부터 import 를 해주어야 사용 가능
  • 리스트 내 각 요소들끼리의 점진적 연산을 통해 하나의 값을 도출
    • map(), filter() 와 다르게 lambda 함수의 argument가 반드시 2개.
    • 현재까지 계산된 값 & 리스트 내 다음 요소
from functools import reduce 

a = ['care', 'free', 'life', '98']
b = [20170, 27, 97]

a = reduce(lambda x, y: x + y, a)
b = reduce(lambda x, y: int((x + y) / 3), b)
print(a, b)

12_reduce_Procdess
reduce() 함수 및 lambda 함수의 적용



enumerate()
  • 리스트, 집합, 튜플 각각의 요소에 “인덱싱”을 해주는 함수
    • 요소만 존재하는 리스트에서 인덱스를 얻고 싶을 때 사용
a = ['care', 'free', 'life', 98]
for idx, element in enumerate(a):
   print(idx, element)

12_enumerate_Procdess
enumerate() 함수 및 lambda 함수의 적용



예제 - map(), reduce(), zip() 활용하기

• 제곱의 평균 구하기: 
    정수 리스트를 인자로 받아 map(), reduce() 함수를 사용하여 제곱의 평균을 반환하는 함수를 작성
    
• 벡터의 내적 구하기: 
    정수 리스트 2개를 인자로 받아 zip() 함수를 활용하여 벡터의 내적을 구해주는 함수를 작성
// 제곱의 평균 구하기

def mean_square(l):
    from functools import reduce
    l = list(map(lambda x: x * x, l))
    print(l)
    result = reduce(lambda x, y: x + y, l) / len(l)
    return result

// 이렇게  줄로 작성할 수도 있다.
def mean_square(l):
    len_l = len(l)
    return reduce(lambda x, y:x+y, list(map(lambda x:x*x, l))) / len_l


if __name__ == '__main__':
    a = [1, 2, 3, 4, 5]
    print(f'리스트의 제곱의 평균은 {mean_square(a)} 입니다.')

12_1_1_Procdess
map(), reduce() 활용하여 리스트의 제곱의 평균 구하기



// 벡터의 내적 구하기

def dot(l1, l2):
    print(f'l1 : {l1} , l2: {l2}')
    sum = 0
    for ele_1, ele_2 in zip(l1, l2):
        sum += ele_1 * ele_2
    return sum

if __name__ == '__main__':
    print(f'벡터의 내적 값은 : {dot([1, 2, 3, 4], [2, 3, 4, 5])}')



최대한의 설명을 코드 블럭 내의 주석으로 달아 놓았습니다.

이해가 안가거나 추가적인 설명이 필요한 부분, 오류 등의 피드백은 언제든지 환영합니다!

긴 글 읽어주셔서 감사합니다. 포스팅을 마칩니다.



처음으로~

Task Lists

  • 리스트 관련 유용한 내장 함수 : map / filter / zip / reduce / enumerate
  • 예제 - map(), reduce(), zip() 활용하기

Comments