최댓값의 키 찾기

Beginner

This tutorial is from open-source community. Access the source code

소개

Python 에서 딕셔너리는 키 - 값 쌍을 저장할 수 있는 유용한 데이터 구조입니다. 때로는 딕셔너리에서 최대 값을 가진 키를 찾아야 할 수 있습니다. 이 챌린지에서는 딕셔너리를 인수로 받아 최대 값을 가진 키를 반환하는 함수를 작성합니다.

이것은 가이드 실험입니다. 학습과 실습을 돕기 위한 단계별 지침을 제공합니다.각 단계를 완료하고 실무 경험을 쌓기 위해 지침을 주의 깊게 따르세요. 과거 데이터에 따르면, 이것은 초급 레벨의 실험이며 완료율은 92%입니다.학습자들로부터 100%의 긍정적인 리뷰율을 받았습니다.

기본 함수 생성

이제 함수의 핵심 부분을 만들어 보겠습니다. 단계별로 구축해 나갈 것입니다. 먼저, key_of_max.py라는 파일을 생성합니다. 내장된 LabEx 코드 편집기 또는 nanovim과 같은 터미널 기반 편집기를 사용할 수 있습니다. key_of_max.py 내부에 다음 코드를 추가합니다.

Code editor with key_of_max function
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()

설명:

  1. import unittest: 테스트 프레임워크를 가져옵니다.
  2. from key_of_max import key_of_max: 테스트하려는 함수를 가져옵니다.
  3. class TestKeyOfMax(unittest.TestCase):: 테스트 클래스를 정의합니다. 테스트 클래스는 관련된 테스트를 함께 그룹화합니다.
  4. def test_basic_case(self):: 테스트 메서드를 정의합니다. 각 테스트 메서드는 함수의 특정 측면을 확인합니다. 테스트 메서드 이름은 test_로 시작해야 합니다.
  5. self.assertEqual(...): 이것은 *어설션 (assertion)*입니다. 두 값이 같은지 확인합니다. 같지 않으면 테스트가 실패합니다. 이 경우 key_of_max({'a': 4, 'b': 0, 'c': 13})'c'를 반환하는지 확인하고 있습니다.
  6. def test_another_case(self):: 최대 값의 키가 고유하지 않을 수 있는지 확인하기 위해 다른 테스트 케이스를 추가했습니다.
  7. 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.pyTestKeyOfMax 클래스에 이 메서드를 추가합니다.

    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 모듈을 사용하여 철저한 단위 테스트를 작성했습니다. 이러한 기능적 코드와 포괄적인 테스트의 조합은 우수한 소프트웨어 개발 관행을 보여줍니다.