Python 람다 함수를 사용하여 딕셔너리 값 업데이트하는 방법

PythonBeginner
지금 연습하기

소개

이 튜토리얼에서는 Python 에서 람다 함수를 사용하여 딕셔너리 값을 업데이트하는 방법을 살펴보겠습니다. 람다 함수는 딕셔너리로 작업할 때 코드를 더 간결하고 읽기 쉽게 만들어주는 소형 익명 함수입니다. 이 가이드가 끝나면, Python 프로그램에서 딕셔너리 연산을 간소화하기 위해 이러한 강력한 도구를 사용하는 방법을 이해하게 될 것입니다.

람다 함수 시작하기

이 단계에서는 람다 함수가 무엇인지, 그리고 Python 에서 어떻게 생성하는지 배우겠습니다.

람다 함수란 무엇인가요?

람다 함수는 lambda 키워드로 정의된 작고 익명적인 함수입니다. def 키워드로 선언된 일반 함수와 달리, 람다 함수는 한 줄로 작성할 수 있으며 이름을 가질 필요가 없습니다. 빠르게 수행해야 하는 간단한 연산에 완벽합니다.

람다 함수의 기본 구문은 다음과 같습니다.

lambda arguments: expression

여기서 arguments는 함수의 입력이고, expression은 결과를 생성하는 연산입니다.

첫 번째 람다 함수 만들기

간단한 람다 함수를 만들고 어떻게 작동하는지 살펴보겠습니다. 상단 메뉴 바에서 "File" > "New File"을 클릭하여 코드 편집기에서 새 Python 파일을 엽니다. 파일 이름을 lambda_basics.py로 지정하고 /home/labex/project 디렉토리에 저장합니다.

다음 코드를 파일에 추가합니다.

## 일반 함수 정의
def add_numbers(x, y):
    return x + y

## 람다로 표현한 동일한 함수
add_lambda = lambda x, y: x + y

## 두 함수 테스트
print("Regular function result:", add_numbers(5, 3))
print("Lambda function result:", add_lambda(5, 3))

터미널을 열고 (아직 열려 있지 않은 경우) 다음을 실행하여 코드를 실행합니다.

python3 lambda_basics.py

다음 출력을 볼 수 있습니다.

Regular function result: 8
Lambda function result: 8

두 함수 모두 동일한 연산을 수행하지만, 람다 버전이 더 간결합니다.

람다 함수를 언제 사용해야 할까요?

람다 함수는 다음과 같은 상황에서 가장 유용합니다.

  1. 짧은 기간 동안 간단한 함수가 필요할 때
  2. 다른 함수에 인수로 함수를 전달하려는 경우
  3. 컬렉션의 항목에 간단한 연산을 적용해야 할 때

다른 예를 살펴보겠습니다. lambda_basics.py 파일에 다음 코드를 추가합니다.

## 내장 함수와 함께 람다 사용
numbers = [1, 2, 3, 4, 5]

## 람다를 사용하여 각 숫자 제곱
squared = list(map(lambda x: x**2, numbers))

## 람다를 사용하여 짝수 필터링
evens = list(filter(lambda x: x % 2 == 0, numbers))

print("Original numbers:", numbers)
print("Squared numbers:", squared)
print("Even numbers:", evens)

파일을 다시 실행합니다.

python3 lambda_basics.py

이제 출력에 다음이 포함됩니다.

Original numbers: [1, 2, 3, 4, 5]
Squared numbers: [1, 4, 9, 16, 25]
Even numbers: [2, 4]

이 예제에서는 mapfilter 내장 함수와 함께 람다 함수를 사용하여 숫자 목록을 변환하고 필터링했습니다. 이러한 종류의 연산은 다음 단계에서 딕셔너리로 작업할 때 유용합니다.

Python 딕셔너리 이해하기

딕셔너리와 함께 람다 함수를 사용하기 전에, Python 에서 딕셔너리가 어떻게 작동하는지 확실히 이해하도록 합시다.

딕셔너리란 무엇인가요?

딕셔너리는 키 - 값 쌍의 모음입니다. 각 키는 값에 연결되어 있어, 키를 알고 있으면 값을 빠르게 액세스할 수 있습니다. 딕셔너리는 변경 가능 (mutable) 하므로, 딕셔너리가 생성된 후 항목을 변경, 추가 또는 제거할 수 있습니다.

딕셔너리 생성 및 액세스

/home/labex/project 디렉토리에 dictionary_basics.py라는 새 파일을 만들고 다음 코드를 추가해 보겠습니다.

## 딕셔너리 생성
product_prices = {
    'apple': 1.50,
    'banana': 0.75,
    'orange': 1.20,
    'grapes': 2.50
}

## 딕셔너리 값 액세스
print("Price of apple:", product_prices['apple'])

## 새 항목 추가
product_prices['watermelon'] = 3.75
print("Updated dictionary:", product_prices)

## 기존 항목 수정
product_prices['banana'] = 0.85
print("After modification:", product_prices)

## 딕셔너리 반복
print("\nAll products and their prices:")
for product, price in product_prices.items():
    print(f"{product}: ${price:.2f}")

파일을 실행합니다.

python3 dictionary_basics.py

다음과 유사한 출력을 볼 수 있습니다.

Price of apple: 1.5
Updated dictionary: {'apple': 1.5, 'banana': 0.85, 'orange': 1.2, 'grapes': 2.5, 'watermelon': 3.75}
After modification: {'apple': 1.5, 'banana': 0.85, 'orange': 1.2, 'grapes': 2.5, 'watermelon': 3.75}

All products and their prices:
apple: $1.50
banana: $0.85
orange: $1.20
grapes: $2.50
watermelon: $3.75

딕셔너리 메서드 사용하기

딕셔너리에는 몇 가지 유용한 메서드가 있습니다. dictionary_basics.py 파일에 다음 코드를 추가해 보겠습니다.

## 딕셔너리 메서드
print("\nDictionary Methods:")
print("Keys:", list(product_prices.keys()))
print("Values:", list(product_prices.values()))
print("Items:", list(product_prices.items()))

## 키가 존재하는지 확인
if 'apple' in product_prices:
    print("Apple is in the dictionary")

## 키가 존재하지 않는 경우 기본값으로 값 가져오기
price = product_prices.get('pineapple', 'Not available')
print("Price of pineapple:", price)

파일을 다시 실행합니다.

python3 dictionary_basics.py

추가 출력을 볼 수 있습니다.

Dictionary Methods:
Keys: ['apple', 'banana', 'orange', 'grapes', 'watermelon']
Values: [1.5, 0.85, 1.2, 2.5, 3.75]
Items: [('apple', 1.5), ('banana', 0.85), ('orange', 1.2), ('grapes', 2.5), ('watermelon', 3.75)]
Apple is in the dictionary
Price of pineapple: Not available

이제 람다 함수와 딕셔너리를 모두 이해했으므로, 다음 단계에서 이를 결합할 준비가 되었습니다.

람다 함수를 사용하여 딕셔너리 값 업데이트하기

이제 람다 함수와 딕셔너리를 모두 이해했으므로, 람다 함수를 사용하여 딕셔너리 값을 업데이트하는 방법을 살펴보겠습니다.

람다를 사용한 기본 딕셔너리 업데이트

/home/labex/project 디렉토리에 update_dictionaries.py라는 새 파일을 만들고 다음 코드를 추가해 보겠습니다.

## 제품 가격 딕셔너리 생성
prices = {
    'apple': 1.50,
    'banana': 0.75,
    'orange': 1.20,
    'grapes': 2.50
}

print("Original prices:", prices)

## 람다 및 딕셔너리 컴프리헨션을 사용하여 모든 가격에 10% 할인 적용
discounted_prices = {item: round(price * 0.9, 2) for item, price in prices.items()}
print("Prices after 10% discount:", discounted_prices)

## 다른 방법: map() 및 람다 사용
## 먼저, map 을 적용하는 함수를 만들어 봅시다.
def apply_to_dict(func, dictionary):
    return dict(map(func, dictionary.items()))

## 이제 함수와 람다를 사용하여 20% 인상 적용
increased_prices = apply_to_dict(lambda item: (item[0], round(item[1] * 1.2, 2)), prices)
print("Prices after 20% increase:", increased_prices)

파일을 실행합니다.

python3 update_dictionaries.py

다음과 유사한 출력을 볼 수 있습니다.

Original prices: {'apple': 1.5, 'banana': 0.75, 'orange': 1.2, 'grapes': 2.5}
Prices after 10% discount: {'apple': 1.35, 'banana': 0.68, 'orange': 1.08, 'grapes': 2.25}
Prices after 20% increase: {'apple': 1.8, 'banana': 0.9, 'orange': 1.44, 'grapes': 3.0}

무슨 일이 일어났는지 자세히 살펴보겠습니다.

  1. 제품 가격 딕셔너리를 만들었습니다.
  2. 10% 할인을 적용하기 위해 간단한 계산과 함께 딕셔너리 컴프리헨션을 사용했습니다.
  3. map()을 사용하고 결과를 다시 딕셔너리로 변환하는 도우미 함수 apply_to_dict를 만들었습니다.
  4. 이 함수를 람다와 함께 사용하여 20% 가격 인상을 적용했습니다.

람다 함수를 사용한 조건부 업데이트

이제 딕셔너리 값을 조건부로 업데이트해 보겠습니다. update_dictionaries.py 파일에 다음 코드를 추가합니다.

print("\n--- Conditional Updates ---")

## 다른 할인 적용: 1.00 달러 초과 품목에 15%, 나머지에 5%
varied_discount = {
    item: round(price * 0.85, 2) if price > 1.00 else round(price * 0.95, 2)
    for item, price in prices.items()
}
print("Varied discounts:", varied_discount)

## filter 와 람다를 사용하여 특정 항목만 업데이트
def update_filtered_items(dictionary, filter_func, update_func):
    ## 먼저, 항목을 필터링합니다.
    filtered = dict(filter(filter_func, dictionary.items()))
    ## 그런 다음, 필터링된 항목을 업데이트합니다.
    updated = {key: update_func(value) for key, value in filtered.items()}
    ## 원래 딕셔너리와 병합 (필터링된 항목만 업데이트)
    result = dictionary.copy()
    result.update(updated)
    return result

## 'a'로 시작하는 과일에만 50% 할인 적용
special_discount = update_filtered_items(
    prices,
    lambda item: item[0].startswith('a'),
    lambda price: round(price * 0.5, 2)
)
print("Special discount on items starting with 'a':", special_discount)

파일을 다시 실행합니다.

python3 update_dictionaries.py

이제 추가 출력을 볼 수 있습니다.

--- Conditional Updates ---
Varied discounts: {'apple': 1.28, 'banana': 0.71, 'orange': 1.02, 'grapes': 2.12}
Special discount on items starting with 'a': {'apple': 0.75, 'banana': 0.75, 'orange': 1.2, 'grapes': 2.5}

이 예제에서:

  1. 가격에 따라 다른 할인율을 적용하기 위해 딕셔너리 컴프리헨션에서 조건부 표현식을 사용했습니다.
  2. 람다 함수를 사용하여 항목을 필터링한 다음, 다른 람다 함수로 필터링된 항목만 업데이트하는 함수를 만들었습니다.
  3. 이 함수를 적용하여 'a'로 시작하는 제품에만 50% 할인을 제공했습니다.

이러한 예제는 람다 함수가 Python 의 map()filter()와 같은 내장 함수와 결합될 때 딕셔너리 업데이트를 더 간결하고 읽기 쉽게 만들 수 있음을 보여줍니다.

고급 응용: 딕셔너리 정렬 및 변환

딕셔너리 데이터를 정렬하고 변환하는 데 중점을 두고 람다 함수를 사용한 몇 가지 더 고급 응용 프로그램을 살펴보겠습니다.

람다 함수를 사용한 딕셔너리 정렬

Python 의 딕셔너리는 기본적으로 정렬되지 않지만, 때로는 특정 순서로 처리해야 합니다. /home/labex/project 디렉토리에 advanced_dictionary_ops.py라는 새 파일을 만들고 다음 코드를 추가해 보겠습니다.

## 학생 점수 딕셔너리 생성
student_scores = {
    'Alice': 92,
    'Bob': 85,
    'Charlie': 78,
    'David': 95,
    'Eva': 88
}

print("Original student scores:", student_scores)

## 학생 이름 (키) 으로 정렬
sorted_by_name = dict(sorted(student_scores.items()))
print("\nSorted by name:", sorted_by_name)

## 점수 (값) 를 오름차순으로 정렬
sorted_by_score_asc = dict(sorted(student_scores.items(), key=lambda item: item[1]))
print("\nSorted by score (ascending):", sorted_by_score_asc)

## 점수 (값) 를 내림차순으로 정렬
sorted_by_score_desc = dict(sorted(student_scores.items(), key=lambda item: item[1], reverse=True))
print("\nSorted by score (descending):", sorted_by_score_desc)

## 점수 상위 3 명의 학생 가져오기
top_3_students = dict(sorted(student_scores.items(), key=lambda item: item[1], reverse=True)[:3])
print("\nTop 3 students:", top_3_students)

파일을 실행합니다.

python3 advanced_dictionary_ops.py

다음과 유사한 출력을 볼 수 있습니다.

Original student scores: {'Alice': 92, 'Bob': 85, 'Charlie': 78, 'David': 95, 'Eva': 88}

Sorted by name: {'Alice': 92, 'Bob': 85, 'Charlie': 78, 'David': 95, 'Eva': 88}

Sorted by score (ascending): {'Charlie': 78, 'Bob': 85, 'Eva': 88, 'Alice': 92, 'David': 95}

Sorted by score (descending): {'David': 95, 'Alice': 92, 'Eva': 88, 'Bob': 85, 'Charlie': 78}

Top 3 students: {'David': 95, 'Alice': 92, 'Eva': 88}

이 예제에서는 sorted() 함수를 람다 함수와 함께 사용하여 딕셔너리를 다양한 방식으로 정렬했습니다.

  • 키 (학생 이름) 별로
  • 값 (점수) 을 오름차순으로
  • 값 (점수) 을 내림차순으로

또한 슬라이싱 [:3]을 사용하여 정렬 후 상위 3 명의 학생만 가져왔습니다.

딕셔너리 값 변환

이제 딕셔너리의 값을 변환하는 방법을 살펴보겠습니다. advanced_dictionary_ops.py 파일에 다음 코드를 추가합니다.

print("\n--- Transforming Dictionary Values ---")

## 섭씨 온도 딕셔너리 생성
celsius_temps = {
    'New York': 21,
    'London': 18,
    'Tokyo': 26,
    'Sydney': 22,
    'Moscow': 14
}

print("Temperatures in Celsius:", celsius_temps)

## 섭씨를 화씨로 변환: F = C * 9/5 + 32
fahrenheit_temps = {city: round(temp * 9/5 + 32, 1) for city, temp in celsius_temps.items()}
print("Temperatures in Fahrenheit:", fahrenheit_temps)

## 온도를 시원함, 보통, 따뜻함으로 분류
def categorize_temp(temp):
    if temp < 18:
        return "Cool"
    elif temp < 25:
        return "Moderate"
    else:
        return "Warm"

categorized_temps = {city: categorize_temp(temp) for city, temp in celsius_temps.items()}
print("Categorized temperatures:", categorized_temps)

## 람다와 reduce 를 사용하여 온도 범주별로 도시 그룹화
from collections import defaultdict
from functools import reduce

grouped_cities = reduce(
    lambda result, item: result[categorize_temp(item[1])].append(item[0]) or result,
    celsius_temps.items(),
    defaultdict(list)
)

print("\nCities grouped by temperature category:")
for category, cities in grouped_cities.items():
    print(f"{category}: {', '.join(cities)}")

파일을 다시 실행합니다.

python3 advanced_dictionary_ops.py

이제 추가 출력을 볼 수 있습니다.

--- Transforming Dictionary Values ---
Temperatures in Celsius: {'New York': 21, 'London': 18, 'Tokyo': 26, 'Sydney': 22, 'Moscow': 14}
Temperatures in Fahrenheit: {'New York': 69.8, 'London': 64.4, 'Tokyo': 78.8, 'Sydney': 71.6, 'Moscow': 57.2}
Categorized temperatures: {'New York': 'Moderate', 'London': 'Moderate', 'Tokyo': 'Warm', 'Sydney': 'Moderate', 'Moscow': 'Cool'}

Cities grouped by temperature category:
Cool: Moscow
Moderate: New York, London, Sydney
Warm: Tokyo

이 예제에서:

  1. 딕셔너리 컴프리헨션을 사용하여 섭씨 온도를 화씨로 변환했습니다.
  2. 도우미 함수를 사용하여 온도를 "Cool", "Moderate", 또는 "Warm"으로 분류했습니다.
  3. reduce() 함수를 람다와 함께 사용하여 온도 범주별로 도시를 그룹화했습니다.

이러한 기술은 람다 함수가 복잡한 딕셔너리 작업을 더 간결하고 읽기 쉽게 만들 수 있음을 보여줍니다. 보시다시피, 람다 함수를 Python 의 내장 함수 및 딕셔너리 연산과 결합하면 강력한 데이터 조작 도구를 제공합니다.

요약

이 튜토리얼에서는 람다 함수를 사용하여 Python 에서 딕셔너리 값을 업데이트하는 방법을 배웠습니다. 다음 내용을 다루었습니다.

  • 람다 함수와 구문 이해
  • Python 에서 딕셔너리 작업
  • 람다 함수를 사용하여 딕셔너리 값을 조건부 및 무조건적으로 업데이트
  • 딕셔너리 정렬 및 값 변환과 같은 고급 응용 프로그램
  • 람다 함수를 Python 의 내장 함수 (예: map(), filter(), reduce()) 와 결합

이러한 기술은 Python 에서 딕셔너리로 작업할 때 더 간결하고 읽기 쉬운 코드를 작성하는 데 도움이 됩니다. Python 여정을 계속 진행하면서 람다 함수가 프로그래밍 도구 상자에서, 특히 데이터 조작 작업에 점점 더 유용한 도구가 될 것입니다.

람다 함수는 강력하지만 간단한 작업에 가장 적합하다는 점을 기억하십시오. 더 복잡한 로직의 경우 코드 가독성과 유지 관리성을 유지하기 위해 일반적인 명명된 함수를 사용하는 것을 고려하십시오.