λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
μΉ΄ν…Œκ³ λ¦¬ μ—†μŒ

[Python]파이썬 ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ° 기법 : λžŒλ‹€, filter, map의 ν™œμš©

by YJ Dev 2024. 4. 16.
728x90
λ°˜μ‘ν˜•
SMALL

ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ° μŠ€νƒ€μΌμ€ pythonμ—μ„œ μ€‘μš”ν•œ 역할을 ν•©λ‹ˆλ‹€. 이번 ν¬μŠ€νŒ…μ—μ„œλŠ” python ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž¨μ˜ 핡심 μš”μ†ŒμΈ λžŒλ‹€, filter, map에 λŒ€ν•΄ μ•Œμ•„λ³΄κ² μŠ΅λ‹ˆλ‹€.

ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ°


λžŒλ‹€, filter, map은 λͺ¨λ‘ ν•¨μˆ˜λ₯Ό μ „λ‹¬ν•˜μ—¬ ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ° μŠ€νƒ€μΌμ„ κ΅¬ν˜„ν•˜λŠ” λ„κ΅¬μž…λ‹ˆλ‹€.

κ·Έ μ€‘μ—μ„œ filter, map ν•¨μˆ˜λŠ” ν•¨μˆ˜λ₯Ό λ§€κ°œλ³€μˆ˜λ‘œ μ‚¬μš©ν•˜λŠ” λ‚΄μž₯ν•¨μˆ˜λ‘œ, μ½”λ“œλ₯Ό κ°„κ²°ν•˜κ³  가독성 있게 λ§Œλ“€μ–΄ μ€λ‹ˆλ‹€.

μ΄λŸ¬ν•œ ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ° 기법은 파이썬 μ½”λ“œλ₯Ό 효율적으둜 μž‘μ„±ν•˜κ³  반볡적인 μž‘μ—…μ„ 쀄여 μœ μ§€λ³΄μˆ˜λ₯Ό μ‰½κ²Œ λ§Œλ“€μ–΄μ€λ‹ˆλ‹€.


1. ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ°μ΄λž€?🧭

ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ°μ€ μš”μ¦˜ μ†Œν”„νŠΈμ›¨μ–΄ κ°œλ°œμ—μ„œ μ€‘μš”ν•œ νŒ¨λŸ¬λ‹€μž„ 쀑 ν•˜λ‚˜μž…λ‹ˆλ‹€.

이 νŒ¨λŸ¬λ‹€μž„μ€ ν•¨μˆ˜λ₯Ό λ§€κ°œλ³€μˆ˜λ‘œ μ „λ‹¬ν•˜λŠ” μ½”λ“œλ₯Ό 자주 μ‚¬μš©ν•˜μ—¬, μ½”λ“œμ˜ 가독성을 ν–₯μƒμ‹œν‚΅λ‹ˆλ‹€.

νŒŒμ΄μ¬μ€ μ΄λŸ¬ν•œ ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ°μ„ μ§€μ›ν•˜μ—¬ λžŒλ‹€, filter, mapκ³Ό 같은 κ³ μ°¨ ν•¨μˆ˜λ₯Ό ν™œμš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

이번 κΈ€μ—μ„œλŠ” νŒŒμ΄μ¬μ—μ„œ ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ° 기법을 ν™œμš©ν•œ λžŒλ‹€, filter, map에 λŒ€ν•΄ μžμ„Ένžˆ μ•Œμ•„λ³΄κ² μŠ΅λ‹ˆλ‹€.


2. λžŒλ‹€ ν•¨μˆ˜πŸ›«

λžŒλ‹€ ν•¨μˆ˜λŠ” ν•œ μ€„λ‘œ ν‘œν˜„λ˜λŠ” 이름이 μ—†λŠ” 읡λͺ… ν•¨μˆ˜λ‘œ, κ°„λ‹¨ν•œ 연산을 μˆ˜ν–‰ν•˜λŠ” 데 μ‚¬μš©λ©λ‹ˆλ‹€.

이 ν•¨μˆ˜λŠ” λ‹€λ₯Έ ν•¨μˆ˜μ˜ 인자둜 μ „λ‹¬λ˜κ±°λ‚˜ ν•¨μˆ˜μ˜ λ°˜ν™˜ κ°’μœΌλ‘œ μ‚¬μš©λ©λ‹ˆλ‹€.

κΈ°λ³Έ ν˜•νƒœλŠ” lambda λ§€κ°œλ³€μˆ˜ : λ¦¬ν„΄κ°’μž…λ‹ˆλ‹€.

예λ₯Ό λ“€μ–΄, 리슀트의 μš”μ†Œλ₯Ό μ œκ³±ν•˜λŠ” ν•¨μˆ˜λ₯Ό λžŒλ‹€ ν•¨μˆ˜λ‘œ ν‘œν˜„ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

# λžŒλ‹€ ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜μ—¬ 리슀트의 각 μš”μ†Œλ₯Ό μ œκ³±ν•˜λŠ” 예제

# μž…λ ₯ 리슀트
numbers = [1, 2, 3, 4, 5]

# λžŒλ‹€ ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜μ—¬ 각 μš”μ†Œλ₯Ό μ œκ³±ν•˜λŠ” ν•¨μˆ˜ μ •μ˜
square = lambda x: x ** 2

# λžŒλ‹€ ν•¨μˆ˜λ₯Ό 리슀트의 각 μš”μ†Œμ— μ μš©ν•˜μ—¬ μƒˆλ‘œμš΄ 리슀트 생성
squared_numbers = [square(num) for num in numbers]

# κ²°κ³Ό 좜λ ₯
print(squared_numbers)  # 좜λ ₯: [1, 4, 9, 16, 25]
  1. numbers = [1, 2, 3, 4, 5]: λ¨Όμ €, μž…λ ₯으둜 μ‚¬μš©ν•  리슀트 numbersλ₯Ό μ •μ˜ν•©λ‹ˆλ‹€. 이 λ¦¬μŠ€νŠΈλŠ” [1, 2, 3, 4, 5]둜 μ΄ˆκΈ°ν™”λ©λ‹ˆλ‹€.
  2. square = lambda x: x ** 2: λ‹€μŒμœΌλ‘œ, λžŒλ‹€ ν•¨μˆ˜λ₯Ό μ •μ˜ν•©λ‹ˆλ‹€. μ—¬κΈ°μ„œλŠ” lambda ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ 각 μš”μ†Œλ₯Ό μ œκ³±ν•˜λŠ” ν•¨μˆ˜λ₯Ό μ •μ˜ν•©λ‹ˆλ‹€. λ§€κ°œλ³€μˆ˜ xλ₯Ό λ°›μ•„μ„œ x의 μ œκ³±μ„ λ°˜ν™˜ν•˜λŠ” ν•¨μˆ˜μž…λ‹ˆλ‹€.
  3. squared_numbers = [square(num) for num in numbers]: 리슀트 μ»΄ν”„λ¦¬ν—¨μ…˜μ„ μ‚¬μš©ν•˜μ—¬ μƒˆλ‘œμš΄ 리슀트λ₯Ό μƒμ„±ν•©λ‹ˆλ‹€. 이 뢀뢄은 리슀트 μ»΄ν”„λ¦¬ν—¨μ…˜μ˜ κ΅¬λ¬Έμž…λ‹ˆλ‹€. 리슀트 μ»΄ν”„λ¦¬ν—¨μ…˜μ€ λŒ€κ΄„ν˜Έ μ•ˆμ— ν‘œν˜„μ‹κ³Ό λ°˜λ³΅λ¬Έμ„ μ‚¬μš©ν•˜μ—¬ 리슀트λ₯Ό μƒμ„±ν•˜λŠ” κ΅¬λ¬Έμž…λ‹ˆλ‹€. μ—¬κΈ°μ„œλŠ” 각 num을 square ν•¨μˆ˜μ— μ μš©ν•˜μ—¬ μƒˆλ‘œμš΄ 리슀트인 squared_numbersλ₯Ό μƒμ„±ν•©λ‹ˆλ‹€.
  4. print(squared_numbers): μ΅œμ’…μ μœΌλ‘œ 제곱된 μˆ«μžλ“€λ‘œ 이루어진 리슀트λ₯Ό 좜λ ₯ν•©λ‹ˆλ‹€.

πŸ™Œ μ—¬κΈ°μ„œ 잠깐!

리슀트 μ»΄ν”„λ¦¬ν—¨μ…˜μ΄λž€?

νŒŒμ΄μ¬μ—μ„œ 리슀트 μ»΄ν”„λ¦¬ν—¨μ…˜μ΄λž€ 리슀트λ₯Ό μƒμ„±ν•˜λŠ” κ°„κ²°ν•˜κ³  효율적인 방법 쀑 ν•˜λ‚˜μž…λ‹ˆλ‹€. 리슀트 μ»΄ν”„λ¦¬ν—¨μ…˜μ€ 반볡문과 쑰건문을 μ‚¬μš©ν•˜μ—¬ 리슀트λ₯Ό μƒμ„±ν•˜λŠ” ν•œ μ€„μ§œλ¦¬ ν‘œν˜„μ‹μž…λ‹ˆλ‹€.

일반적으둜 λ‹€μŒκ³Ό 같은 ꡬ쑰λ₯Ό κ°€μ§‘λ‹ˆλ‹€.

[ν‘œν˜„μ‹ for ν•­λͺ© in iterable if 쑰건]

  • ν‘œν˜„μ‹ : 각 ν•­λͺ©μ— λŒ€ν•œ κ³„μ‚°μ΄λ‚˜ λ³€ν™˜μ„ λ‚˜νƒ€λ‚΄λŠ” ν‘œν˜„μ‹
  • ν•­λͺ© : λ°˜λ³΅ν•  μš”μ†Œ, iterable은 반볡 κ°€λŠ₯ν•œ 개체
  • if 쑰건 : ν•„μš”ν•œ 경우 μ„ νƒμ μœΌλ‘œ μ‚¬μš©λ˜λŠ” 쑰건. 이 쑰건을 λ§Œμ‘±ν•˜λŠ” ν•­λͺ©λ§Œ 포함

3. filter ν•¨μˆ˜μ˜ ν™œμš©πŸš₯

filter ν•¨μˆ˜λŠ” 주어진 ν•¨μˆ˜λ‘œλΆ€ν„° Trueλ₯Ό λ°˜ν™˜ν•˜λŠ” μš”μ†Œλ“€λ§Œ μ„ νƒν•˜μ—¬ μƒˆλ‘œμš΄ 리슀트λ₯Ό λ§Œλ“­λ‹ˆλ‹€. 이λ₯Ό 톡해 리슀트의 μš”μ†Œλ₯Ό 쑰건에 맞게 필터링할 수 μžˆμŠ΅λ‹ˆλ‹€. 기본적인 ν˜•νƒœλŠ” fillter(ν•¨μˆ˜, 반볡 κ°€λŠ₯ν•œ 객체)μž…λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄, 주어진 λ¦¬μŠ€νŠΈμ—μ„œ 짝수만 ν•„ν„°λ§ν•˜λŠ” ν•¨μˆ˜λ₯Ό μž‘μ„±ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

# 짝수λ₯Ό νŒλ³„ν•˜λŠ” ν•¨μˆ˜ μ •μ˜
def is_even(num):
    return num % 2 == 0

# μž…λ ₯ 리슀트
numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

# filter ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜μ—¬ 짝수λ₯Ό ν•„ν„°λ§ν•˜μ—¬ μƒˆλ‘œμš΄ 리슀트 생성
even_numbers = list(filter(is_even, numbers))

# κ²°κ³Ό 좜λ ₯
print(even_numbers)  # 좜λ ₯: [2, 4, 6, 8, 10]
  1. def is_even(num):: λ¨Όμ €, 짝수λ₯Ό νŒλ³„ν•˜λŠ” ν•¨μˆ˜ is_even을 μ •μ˜ν•©λ‹ˆλ‹€. 이 ν•¨μˆ˜λŠ” λ§€κ°œλ³€μˆ˜ num이 μ§μˆ˜μΈμ§€ νŒλ³„ν•˜μ—¬ True λ˜λŠ” Falseλ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.
  2. numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]: μž…λ ₯으둜 μ‚¬μš©ν•  리슀트 numbersλ₯Ό μ •μ˜ν•©λ‹ˆλ‹€. 이 λ¦¬μŠ€νŠΈλŠ” [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]으둜 μ΄ˆκΈ°ν™”λ©λ‹ˆλ‹€.
  3. even_numbers = list(filter(is_even, numbers)): filter() ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜μ—¬ 주어진 λ¦¬μŠ€νŠΈμ—μ„œ 짝수λ₯Ό ν•„ν„°λ§ν•˜μ—¬ μƒˆλ‘œμš΄ 리슀트λ₯Ό μƒμ„±ν•©λ‹ˆλ‹€. filter() ν•¨μˆ˜λŠ” 첫 번째 인자둜 ν•¨μˆ˜λ₯Ό, 두 번째 인자둜 반볡 κ°€λŠ₯ν•œ(iterable) 객체λ₯Ό λ°›μŠ΅λ‹ˆλ‹€. 이 ν•¨μˆ˜λŠ” 두 번째 인자둜 받은 각 μš”μ†Œμ— 첫 번째 인자둜 받은 ν•¨μˆ˜λ₯Ό μ μš©ν•˜μ—¬ 쑰건을 λ§Œμ‘±ν•˜λŠ” μš”μ†Œλ§Œ λ°˜ν™˜ν•©λ‹ˆλ‹€.
  4. print(even_numbers): μ΅œμ’…μ μœΌλ‘œ ν•„ν„°λ§λœ μ§μˆ˜λ“€λ‘œ 이루어진 리슀트λ₯Ό 좜λ ₯ν•©λ‹ˆλ‹€.

4. map ν•¨μˆ˜μ˜ ν™œμš©πŸš©

map ν•¨μˆ˜λŠ” 주어진 ν•¨μˆ˜λ₯Ό μ‹œν€€μŠ€(리슀트, νŠœν”Œ λ“±)의 각 μš”μ†Œμ— μ μš©ν•˜μ—¬ μƒˆλ‘œμš΄ μ‹œν€€μŠ€λ₯Ό μƒμ„±ν•©λ‹ˆλ‹€. 이λ₯Ό 톡해 μ‹œν€€μŠ€μ˜ λͺ¨λ“  μš”μ†Œμ— λ™μΌν•œ 연산을 μ μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 기본적인 ν˜•νƒœλŠ” map(ν•¨μˆ˜, 반볡 κ°€λŠ₯ν•œ 객체)μž…λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄ 주어진 각 μš”μ†Œλ₯Ό μ œκ³±ν•˜λŠ” ν•¨μˆ˜λ₯Ό μž‘μ„±ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

# 각 숫자λ₯Ό μ œκ³±ν•˜λŠ” ν•¨μˆ˜ μ •μ˜
def square(num):
    return num ** 2

# μž…λ ₯ 리슀트
numbers = [1, 2, 3, 4, 5]

# map ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜μ—¬ 각 μˆ«μžμ— 제곱 ν•¨μˆ˜λ₯Ό μ μš©ν•˜μ—¬ μƒˆλ‘œμš΄ 리슀트 생성
squared = list(map(square, numbers))

# κ²°κ³Ό 좜λ ₯
print(squared)  # 좜λ ₯: [1, 4, 9, 16, 25]
  1. def square(num)::λ¨Όμ €,각 숫자λ₯Ό μ œκ³±ν•˜λŠ” ν•¨μˆ˜ square을 μ •μ˜ν•©λ‹ˆλ‹€. 이 ν•¨μˆ˜λŠ” λ§€κ°œλ³€μˆ˜ num을 λ°›μ•„μ„œ num의 μ œκ³±μ„ λ°˜ν™˜ν•©λ‹ˆλ‹€.
  2. numbers = [1, 2, 3, 4, 5]: μž…λ ₯으둜 μ‚¬μš©ν•  리슀트 numbersλ₯Ό μ •μ˜ν•©λ‹ˆλ‹€. 이 λ¦¬μŠ€νŠΈλŠ” [1, 2, 3, 4, 5]둜 μ΄ˆκΈ°ν™”λ©λ‹ˆλ‹€.
  3. squared = list(map(square, numbers)): map() ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜μ—¬ 각 μˆ«μžμ— 제곱 ν•¨μˆ˜λ₯Ό μ μš©ν•˜μ—¬ μƒˆλ‘œμš΄ 리슀트λ₯Ό μƒμ„±ν•©λ‹ˆλ‹€. map() ν•¨μˆ˜λŠ” 첫 번째 인자둜 ν•¨μˆ˜λ₯Ό, 두 번째 인자둜 반볡 κ°€λŠ₯ν•œ(iterable) 객체λ₯Ό λ°›μŠ΅λ‹ˆλ‹€. 이 ν•¨μˆ˜λŠ” 두 번째 인자둜 받은 각 μš”μ†Œμ— 첫 번째 인자둜 받은 ν•¨μˆ˜λ₯Ό μ μš©ν•˜μ—¬ μƒˆλ‘œμš΄ 값을 μƒμ„±ν•©λ‹ˆλ‹€.
  4. print(squared): μ΅œμ’…μ μœΌλ‘œ 제곱된 μˆ«μžλ“€λ‘œ 이루어진 리슀트λ₯Ό 좜λ ₯ν•©λ‹ˆλ‹€.

λ¦¬μŠ€νŠΈμ™€ νŠœν”Œμ— κ΄€ν•œ λ‚΄μš©μ΄ κΆκΈˆν•˜μ‹œλ‹€λ©΄ μ§€λ‚œ ν¬μŠ€νŒ…μ„ 확인해 μ£Όμ„Έμš”πŸ˜„

" "

[파이썬]리슀트(list)와 νŠœν”Œ(tuple)

λͺ©μ°¨ 1. μ»¬λ ‰μ…˜ μžλ£Œν˜•μ΄λž€ 2. list 3. tuple 4. list와 tuple 비ꡐ 5. ν•΅μ‹¬λ‚΄μš© μ§€λ‚œ μ‹œκ°„μ—λŠ” κΈ°λ³Έ μžλ£Œν˜•μ— λŒ€ν•΄ μ•Œμ•„λ³΄μ•˜λŠ”λ°μš”! μ˜€λŠ˜μ€ 파이썬 μ»¬λ ‰μ…˜ μžλ£Œν˜• 쀑 리슀트(list)와 νŠœν”Œ(tuple)에 λŒ€ν•΄ μ•Œμ•„

creativevista.tistory.com


5. 핡심 λ‚΄μš©πŸ‘€

λžŒλ‹€, filter, map

728x90
λ°˜μ‘ν˜•
LIST