본문 바로가기

python/파이썬 효율적으로 코딩하기

dict.key()로 순환하지 않기

dict.items()가 필요할 경우 dict.keys()로 순환하지 않기

파이썬의 목록과 색인 위치와 값의 사상(mapping)을 거의 동일시하는 경우가 있다.

더보기

파이썬에서 "사상"이라는 용어는 일반적으로 "mapping" 또는 "association"의 의미로 사용됩니다. 이 개념은 특정 집합의 원소들 간의 관계를 정의하는 것입니다. 파이썬에서는 사상(mapping)을 보통 딕셔너리(dictionary)와 같은 데이터 구조로 구현합니다.

여기서 색인 위치와 값의 사상을 거의 동일시하는 경우는, 목록(list)와 그 인덱스 간의 관계를 의미합니다. 목록(list)은 인덱스와 값 간의 직접적인 사상을 제공합니다. 즉, 목록의 각 인덱스는 해당 인덱스에 위치한 값을 가리킵니다. 이 경우, 인덱스는 사상의 "키" 역할을 하고, 목록의 값은 사상의 "값" 역할을 합니다.

예를 들어, 리스트 `my_list = ['a', 'b', 'c']`를 고려하면:
- 인덱스 0은 값 'a'와 사상됩니다.
- 인덱스 1은 값 'b'와 사상됩니다.
- 인덱스 2는 값 'c'와 사상됩니다.

이와 같은 관계를 "사상"으로 이해할 수 있습니다. 즉, 인덱스와 리스트의 값 간의 관계를 정의하는 것과 같다고 볼 수 있습니다. 리스트의 인덱스와 값 간의 관계는 파이썬에서 사상(mapping)으로 표현될 수 있는 개념 중 하나입니다.

 

목록의 색인 위치를 순환하면서 데이터 안에서 그 색인에 해당하는 값을 찾는 경우 다음과 같은 코드를 작성할 수 있다.

for k in my_dict.keys():
	add_num(k, my_dict[key)

위 코드에서 my_dict.keys()를 순환하는 것은 my_dict 자체를 순환하는 것과 완전히 동일하기 때문에 적절하지 않다. 자세히 살펴보면 서로 약간 다른 형태의 객체가 생성된다.

- my_dict.keys() => dict_keys 생성

- my_dict => dict_keyiterator 생성

하지만 두 객체는 동일한 용도로 사용되기 때문에 실제 코드에서 차이를 실감하는 경우는 거의 없다.

 

my_dict = {c:ord(c) for c in "test"}
print(type(my_dict.keys()))
/// <class 'dict_key'>
print(type(iter(my_dict)))
/// <class 'dict_keyiterator'>

 

딕셔너리의 키를 순환하고 싶다면 다음과 같이 작성하는 것이 좋다.

for k in my_dict:
	add_num(k, my_dict[k])

 

일반적으로 딕셔너리에서 키만 사용하기 위해 순환하는 경우는 거의 없다. 딕셔너리의 값이 거의 쓰이지 않는다고 하더라도 딕셔너리 전체를 순환하는 것이 좋다. 이를 순환 변수로 포함하는 비용이 거의 들지 않기 때문이다. 파이썬에서는 객체를 직접 사용하는 것이 아니라, 객체를 가리키는 '주소'를 통해 접근한다. 즉, 참조를 통해 접근한다.