Python

[Python] map filter reduce

왕초보코딩러 2024. 6. 25. 18:29
728x90

https://docs.python.org/2/tutorial/datastructures.html#the-del-statement

 

5. Data Structures — Python 2.7.18 documentation

5. Data Structures This chapter describes some things you’ve learned about already in more detail, and adds some new things as well. 5.1. More on Lists The list data type has some more methods. Here are all of the methods of list objects: list.append(x)

docs.python.org

 

예제는 여기서 사용했습니다.

https://www.learnpython.org/en/Map,_Filter,_Reduce

 

Learn Python - Free Interactive Python Tutorial

Welcome Welcome to the LearnPython.org interactive Python tutorial. Whether you are an experienced programmer or not, this website is intended for everyone who wishes to learn the Python programming language. You are welcome to join our group on Facebook f

www.learnpython.org

 


map, filter, reduce: 리스트와 함께 사용하면 좋은 Functional Programming Tools

 

map(function, *iterables) 

iterables의 items를 function에 넣었을 때 결과들을 return한다.

리스트로 바꾸고 싶다면 list()로 감싸준다.

list(map(function, *iterables))

 

map 예제1

#애완동물 이름 목록을 대문자로 바꾸기
my_pets = ['alfred', 'tabitha', 'william', 'arla']

list(map(lambda x:x.upper(), my_pets)) # ['ALFRED', 'TABITHA', 'WILLIAM', 'ARLA']

 

 

 

function이 두 개 이상의 argument를 필요로 한다면

map(function, iterable, iterable, ...)

 

map 예제2

# 첫 번째 요소는 소수점 이하 한 자리, 두 번째 요소는 소수점 이하 두 자리, ..반복
# round(값, 소수점 몇 번째 자리까지)
circle_areas = [3.56773, 5.57668, 4.00914, 56.24241, 9.01344, 32.00013]

list(map(round, circle_areas, range(1, 3))) # [3.6, 5.58]

 

 

 

sequence들의 length가 다르면 -> length가 짧은 iterable까지만 반복하고 끝남

 

map 예제3

# map()으로 zip() 기능 만들기
my_strings = ['a', 'b', 'c', 'd']
my_numbers = [1, 2, 3, 4, 5]

# zip으로 [('a', 1), ('b', 2), ('c', 3), ('d', 4)]
print(list(zip(my_strings, my_numbers)))

# map으로 [('a', 1), ('b', 2), ('c', 3), ('d', 4)]
print(list(map(lambda x,y: (x,y), my_strings, my_numbers)))

 


filter(function, iterable) 

iterable의 items를 function에 넣었을 때 true인 것만 return한다. (true인 iterable만 필터링하여 return)

리스트로 바꾸고 싶다면 list()로 감싸준다.

list(filter(function, iterable))

 

filter 예제1

# 75점 이상만 필터링
scores = [66, 90, 68, 59, 76, 60, 88, 74, 81, 65]

def filter_scores(score):
    return score >= 75 #True or False

list(filter(filter_scores, scores)) # [90, 76, 88, 81]

 

filter 예제2

# 앞으로 읽어도 뒤로 읽어도 똑같은 단어 찾기
dromes = ("demigod", "rewire", "madam", "freer", "anutforajaroftuna", "kiosk")

list(filter(lambda word:word == word[::-1], dromes)) # ['madam', 'anutforajaroftuna']

reduce(function, iterable[, initial]) 

sequence의 처음 두 item를 function에 넣어 단일 값으로 return한다(두 개를 넣으면 하나로 반환)

iterable이 끝날 때까지 반복

 

reduce는 functools 패키지를 임포트 해야 한다.

from functools import reduce

 

reduce 예제1

# reduce()로 sum() 기능 만들기
numbers = [3, 4, 6, 9, 34, 12]

reduce(lambda x, y:x+y, numbers)

 

 

iterable에 item이 하나일 때 -> 그 값 하나를 return

iterable 가 비어있을 때 -> exception 발생

exception 발생 안하게 하려면 -> 세 번째 argument를 이용(빈 iterable에 대한 return 값/ iterable의 초기값)

reduce(function, iterable, initial)

 


Exercise 예제

from functools import reduce

# Use map to print the square of each numbers rounded
# to three decimal places
my_floats = [4.35, 6.09, 3.25, 9.77, 2.16, 8.88, 4.59]
print(list(map(lambda x:round(x**2, 3) ,my_floats)))

# # Use filter to print only the names that are less than
# # or equal to seven letters
my_names = ["olumide", "akinremi", "josiah", "temidayo", "omoseun"]
print(list(filter(lambda st: len(st)<8, my_names)))

# # Use reduce to print the product of these numbers
my_numbers = [4, 6, 9, 23, 5]
print(reduce(lambda x,y:x*y, my_numbers))

 

+ lambda에 조건을 적으면 boolean값으로 return 된다

my_names = ["olumide", "akinremi", "josiah", "temidayo", "omoseun"]

# [True, False, True, False, True]
list(map(lambda st: len(st)<8, my_names))

'Python' 카테고리의 다른 글

[Python] OS 모듈  (0) 2024.07.02
[Python] Lambda Expressions  (0) 2024.06.26
[Python] List methods  (0) 2024.06.24
[Python] List Comprehensions  (0) 2024.06.23
[Python] VSCode에서 파이썬 가상환경 만들기  (0) 2024.06.20