Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

Python 리스트 요소에 고유 ID 할당하는 2가지 방법

데이터 처리 과정에서 리스트에 담긴 요소들을 서로 구분해야 하는 경우가 자주 발생합니다. 이럴 때 각 요소에 고유한 ID를 부여하면 중복 여부와 관계없이 모든 요소를 명확하게 식별할 수 있습니다. Python은 내장 함수만으로도 이 작업을 손쉽게 처리할 수 있으며, 대표적인 방법으로 enumerate + set 조합과 itertools.count + map 조합이 있습니다.

enumerate와 set을 활용한 방법

enumerate 함수는 반복 가능한 객체의 각 요소에 순번을 매기는 역할을 합니다. 다만 리스트에 중복된 값이 존재한다면, 먼저 set으로 중복을 제거한 뒤 딕셔너리 컴프리헨션을 이용해 '값 → ID' 형태의 매핑 테이블을 만들고, 원본 리스트의 각 요소를 이 테이블로 조회하는 방식으로 고유 ID를 할당합니다.

예제 코드

# 주어진 리스트
Alist = [5, 3, 3, 12]
print("주어진 리스트 : ", Alist)

# 값에 고유 ID 할당
enum_dict = {v: k for k, v in enumerate(set(Alist))}
list_ids = [enum_dict[n] for n in Alist]

# 고유 ID 목록 출력
print("고유 ID 목록 : ", list_ids)

실행 결과

위 코드를 실행하면 다음과 같은 결과를 얻을 수 있습니다.

주어진 리스트 : [5, 3, 3, 12]
고유 ID 목록 : [2, 0, 0, 1]

참고로 set은 해시 기반 자료구조이므로 요소의 저장 순서가 보장되지 않습니다. 따라서 실행 환경에 따라 부여되는 ID 값은 달라질 수 있지만, 같은 값에는 항상 동일한 ID가 매핑된다는 점은 변하지 않습니다.

count()와 map()을 활용한 방법

itertools 모듈의 count() 함수는 0부터 시작해 무한히 증가하는 정수 시퀀스를 생성합니다. map() 함수는 전달받은 여러 iterable에서 요소를 하나씩 가져와 지정한 함수에 차례대로 적용합니다. 이 두 함수를 빈 딕셔너리의 setdefault 메서드와 함께 사용하면, 처음 등장하는 값에는 새로운 ID가 할당되고 이미 등장했던 값에는 기존 ID가 그대로 반환됩니다.

예제 코드

from itertools import count

# 주어진 리스트
Alist = [5, 3, 3, 12]
print("주어진 리스트 : ", Alist)

# 리스트 요소에 고유 ID 할당
dict_ids = list(map({}.setdefault, Alist, count()))

# 결과 출력
print("고유 ID 목록 : ", dict_ids)

실행 결과

위 코드를 실행하면 다음과 같은 결과를 얻을 수 있습니다.

주어진 리스트 : [5, 3, 3, 12]
고유 ID 목록 : [0, 1, 1, 3]

출력 결과를 보면 중복된 값 3에는 동일한 ID인 1이 두 번 할당된 것을 확인할 수 있습니다. 또한 count()가 호출될 때마다 계속 증가하기 때문에, 중복 처리 과정에서 번호가 소모되어 마지막 요소 12의 ID가 2가 아닌 3이 되는 점도 특징입니다.

두 방법의 비교

enumerate + set 방식은 코드가 직관적이고 읽기 쉬운 장점이 있지만, set의 특성상 ID 부여 순서가 실제 등장 순서와 일치하지 않을 수 있습니다. 반면 count() + map() 방식은 값이 처음 등장한 순서를 기준으로 ID가 매겨지지만, 중복이 처리되는 동안에도 count가 증가하기 때문에 ID에 건너뛰는 번호가 생길 수 있습니다. 두 방식의 특성을 이해하고 상황에 맞게 선택하면 됩니다.