소개
Python 에서 딕셔너리는 키 - 값 쌍을 저장할 수 있는 유용한 데이터 구조입니다. 때로는 딕셔너리에서 최대 값을 가진 키를 찾아야 할 수 있습니다. 이 챌린지에서는 딕셔너리를 인수로 받아 최대 값을 가진 키를 반환하는 함수를 작성합니다.
기본 함수 생성
이제 함수의 핵심 부분을 만들어 보겠습니다. 단계별로 구축해 나갈 것입니다. 먼저, key_of_max.py라는 파일을 생성합니다. 내장된 LabEx 코드 편집기 또는 nano나 vim과 같은 터미널 기반 편집기를 사용할 수 있습니다. key_of_max.py 내부에 다음 코드를 추가합니다.

def key_of_max(d):
"""
딕셔너리 'd'에서 최대 값과 관련된 키를 반환합니다.
여러 키가 최대 값을 공유하는 경우, 그 중 하나가 반환될 수 있습니다.
"""
return max(d, key=d.get)
다음은 분석입니다.
def key_of_max(d)::key_of_max라는 함수를 정의합니다. 이 함수는d라는 하나의 인수를 받으며, 이는 우리가 작업할 딕셔너리를 나타냅니다.return max(d, key=d.get): 이것이 함수의 핵심입니다. 조각별로 분석해 보겠습니다.max(d, ...): 내장 함수max()는 가장 큰 항목을 찾습니다. 기본적으로max()에 딕셔너리를 제공하면 가장 큰 키 (알파벳순) 를 찾습니다. 우리는 그것을 원하지 않습니다. 우리는 가장 큰 값과 관련된 키를 원합니다.key=d.get: 이것이 중요한 부분입니다.key인수는max()에게 항목을 비교하는 방법을 알려줍니다.d.get은 딕셔너리의 메서드입니다.d.get(some_key)를 호출하면some_key와 관련된 값을 반환합니다.key=d.get을 설정함으로써, 우리는max()에게 "딕셔너리d의 항목을 키가 아닌 값을 사용하여 비교하라"고 지시하는 것입니다. 그런 다음max()함수는 해당 최대 값에 해당하는 키를 반환합니다.
빈 딕셔너리 케이스 처리
현재 함수에는 문제가 있습니다. 입력 딕셔너리 d가 비어 있으면 충돌이 발생합니다. 이를 수정해 보겠습니다. key_of_max.py를 다음과 같이 수정합니다.
def key_of_max(d):
"""
딕셔너리 'd'에서 최대 값과 관련된 키를 반환합니다.
여러 키가 최대 값을 공유하는 경우, 그 중 하나가 반환될 수 있습니다.
"""
if not d: ## 딕셔너리가 비어 있는지 확인
return None
return max(d, key=d.get)
추가된 줄은 다음을 수행합니다.
if not d:: Python 에서 빈 딕셔너리는 "falsy"로 간주됩니다. 이if문은 딕셔너리d가 비어 있는지 확인합니다.return None: 딕셔너리가 비어 있으면 최대 값이 없으므로None을 반환합니다. 이것은 Python 에서 값의 부재를 나타내는 표준 방법입니다. 이렇게 하면max()함수가 오류를 발생시키지 않습니다.
이것은 견고한 코드를 작성하는 데 중요한 단계입니다. 항상 예외 케이스를 고려하십시오!
유닛 테스트 생성: 기본 테스트
이제 함수가 올바르게 작동하는지 확인하기 위해 몇 가지 테스트를 작성해 보겠습니다. Python 의 unittest 모듈을 사용합니다. test_key_of_max.py라는 새 파일을 생성하고 다음 코드를 추가합니다.
import unittest
from key_of_max import key_of_max ## 함수 가져오기
class TestKeyOfMax(unittest.TestCase):
def test_basic_case(self):
self.assertEqual(key_of_max({'a': 4, 'b': 0, 'c': 13}), 'c')
def test_another_case(self):
self.assertEqual(key_of_max({'apple': 10, 'banana': 5, 'orange': 10}), 'apple')
if __name__ == '__main__':
unittest.main()
설명:
import unittest: 테스트 프레임워크를 가져옵니다.from key_of_max import key_of_max: 테스트하려는 함수를 가져옵니다.class TestKeyOfMax(unittest.TestCase):: 테스트 클래스를 정의합니다. 테스트 클래스는 관련된 테스트를 함께 그룹화합니다.def test_basic_case(self):: 테스트 메서드를 정의합니다. 각 테스트 메서드는 함수의 특정 측면을 확인합니다. 테스트 메서드 이름은test_로 시작해야 합니다.self.assertEqual(...): 이것은 *어설션 (assertion)*입니다. 두 값이 같은지 확인합니다. 같지 않으면 테스트가 실패합니다. 이 경우key_of_max({'a': 4, 'b': 0, 'c': 13})이'c'를 반환하는지 확인하고 있습니다.def test_another_case(self):: 최대 값의 키가 고유하지 않을 수 있는지 확인하기 위해 다른 테스트 케이스를 추가했습니다.if __name__ == '__main__': unittest.main(): 이 표준 Python 관용구는 스크립트를 직접 실행할 때 (예:python3 test_key_of_max.py) 테스트를 실행합니다.
터미널에서 테스트를 실행합니다: python3 test_key_of_max.py. 두 테스트가 통과했음을 나타내는 출력이 표시되어야 합니다.
python3 test_key_of_max.py
----------------------------------------------------------------------
Ran 2 tests in 0.000s
OK
빈 딕셔너리 테스트 (예외 케이스)
빈 딕셔너리 케이스에 대한 테스트를 추가해 보겠습니다. test_key_of_max.py의 TestKeyOfMax 클래스에 이 메서드를 추가합니다.
def test_empty_dictionary(self):
self.assertIsNone(key_of_max({}))
self.assertIsNone(...): 이 어설션은 값이 특히None인지 확인합니다.self.assertEqual(..., None)은None으로 평가되지만 실제로None이 아닌 것에 대해 통과할 수 있기 때문에 중요합니다.assertIsNone은 더 엄격합니다.
테스트를 다시 실행합니다 (python3 test_key_of_max.py). 이제 세 개의 테스트 (두 개의 기본 테스트와 빈 딕셔너리 테스트) 가 모두 통과해야 합니다.
python3 test_key_of_max.py
----------------------------------------------------------------------
Ran 3 tests in 0.000s
OK
모든 음수 값으로 테스트
마지막 테스트로, 딕셔너리의 모든 값이 음수인 경우를 처리해 보겠습니다. TestKeyOfMax에 이 메서드를 추가합니다.
def test_all_negative_values(self):
self.assertEqual(key_of_max({'x': -5, 'y': -2, 'z': -10}), 'y')
이 테스트는 함수가 가장 작은 음수 값 (이 경우 최대값) 을 올바르게 식별하고 관련 키를 반환하는지 확인합니다.
마지막으로 테스트를 실행합니다 (python3 test_key_of_max.py). 네 개의 테스트가 모두 통과해야 합니다. 이를 통해 함수가 올바르게 작동한다는 높은 신뢰도를 얻을 수 있습니다.
완전한 test_key_of_max.py는 이제 다음과 같아야 합니다.
import unittest
from key_of_max import key_of_max
class TestKeyOfMax(unittest.TestCase):
def test_basic_case(self):
self.assertEqual(key_of_max({'a': 4, 'b': 0, 'c': 13}), 'c')
def test_another_case(self):
self.assertEqual(key_of_max({'apple': 10, 'banana': 5, 'orange': 10}), 'apple')
def test_empty_dictionary(self):
self.assertIsNone(key_of_max({}))
def test_all_negative_values(self):
self.assertEqual(key_of_max({'x': -5, 'y': -2, 'z': -10}), 'y')
if __name__ == '__main__':
unittest.main()
테스트를 다시 실행합니다 (python3 test_key_of_max.py). 네 개의 테스트가 모두 통과해야 합니다. 이를 통해 함수가 올바르게 작동한다는 높은 신뢰도를 얻을 수 있습니다.
python3 test_key_of_max.py
----------------------------------------------------------------------
Ran 4 tests in 0.000s
OK
요약
이 랩에서는 딕셔너리에서 가장 큰 값과 관련된 키를 찾는 Python 함수 key_of_max를 만들었습니다. 사용자 정의 key 인수를 사용하여 max() 함수를 사용하는 방법을 배웠고, 빈 딕셔너리의 중요한 예외 케이스를 처리했습니다. 또한 기본 케이스, 빈 딕셔너리 및 모든 음수 값을 가진 딕셔너리를 다루는 unittest 모듈을 사용하여 철저한 단위 테스트를 작성했습니다. 이러한 기능적 코드와 포괄적인 테스트의 조합은 우수한 소프트웨어 개발 관행을 보여줍니다.