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

Python 리스트에서 중복 제거하는 방법: dict.fromkeys()와 set() 완벽 가이드

Python에서 리스트를 다루다 보면 중복된 값을 제거해야 하는 경우가 자주 발생합니다. 예를 들어, 레스토랑 셰프가 기존 메뉴와 새 메뉴를 하나로 통합할 때 두 메뉴에 겹치는 항목이 있다면 이를 정리해야겠죠.

이 글에서는 dict.fromkeys() 메서드와 set(집합)을 활용해 리스트의 중복을 제거하는 방법을 소개하고, 처리 결과를 다시 리스트 형태로 변환하는 방법까지 살펴봅니다.


Python 리스트에서 중복 제거하기

Python에서 리스트의 중복을 제거하려면 set 또는 dict.fromkeys() 메서드를 사용할 수 있습니다.

dict.fromkeys() 메서드는 리스트를 딕셔너리로 변환합니다. 딕셔너리는 중복된 키를 가질 수 없기 때문에, 변환 과정에서 자동으로 고유한 값만 남게 됩니다.

집합(set) 역시 딕셔너리와 마찬가지로 중복 값을 저장할 수 없습니다. 따라서 리스트를 집합으로 변환하면 모든 중복 항목이 사라집니다.

dict.fromkeys()로 중복 제거하기

Python 딕셔너리는 키(key)와 값(value) 쌍으로 데이터를 저장하는 자료구조입니다. 각 키는 특정 값에 매핑되며, 동일한 키가 두 번 존재할 수 없습니다.

따라서 리스트를 딕셔너리로 변환하면 중복된 값이 자동으로 제거되는데, 바로 이때 fromkeys() 메서드가 유용하게 사용됩니다.

dict.fromkeys() 기본 문법

fromkeys()는 지정한 키들로 새로운 딕셔너리를 생성하는 내장 함수입니다. 딕셔너리는 중복 키를 허용하지 않으므로, 이 함수를 거치면 리스트의 중복 값이 제거됩니다. 이후 딕셔너리를 다시 리스트로 변환하면 됩니다.

fromkeys() 메서드의 기본 문법은 다음과 같습니다:

dictionary_name.fromkeys(keys, value)

fromkeys()는 두 개의 매개변수를 받습니다. 첫 번째 keys는 새 딕셔너리의 키가 될 반복 가능한(iterable) 객체이고, 두 번째 value는 선택 사항으로 모든 키에 할당할 값을 지정합니다. 중복 제거에는 value 매개변수가 필요 없으므로 생략합니다.

dict.fromkeys() 예제

피자 가게 셰프가 기존 메뉴와 신메뉴를 하나의 큰 메뉴로 통합한다고 가정해 보겠습니다. 몇 달간 개발한 새로운 피자들이 추가되지만, 기존 메뉴의 피자도 그대로 판매해야 합니다. 메뉴에 같은 피자가 중복해서 등장하면 손님들이 혼란스러워할 수 있겠죠.

새 메뉴에 포함된 중복 항목을 제거하려면 다음 코드를 사용할 수 있습니다:

new_menu = ['Hawaiian', 'Margherita', 'Mushroom', 'Prosciutto', 'Meat Feast', 'Hawaiian', 'Bacon', 'Black Olive Special', 'Sausage', 'Sausage']

final_new_menu = list(dict.fromkeys(new_menu))

print(final_new_menu)

코드를 실행하면 중복 요소가 제거된 결과가 출력됩니다:

['Hawaiian', 'Margherita', 'Mushroom', 'Prosciutto', 'Meat Feast', 'Bacon', 'Black Olive Special', 'Sausage']

첫 번째 줄에서는 새 메뉴의 모든 피자를 담은 new_menu 변수를 선언했습니다. 이 리스트에는 SausageHawaiian이 각각 두 번씩 포함되어 있어 중복이 존재합니다.

다음으로 dict.fromkeys() 메서드로 new_menu 변수를 딕셔너리로 변환합니다. 이어서 list() 함수를 사용해 딕셔너리를 다시 Python 리스트로 되돌립니다. 마지막 줄에서 수정된 리스트를 출력합니다.

결과를 보면 중복 값이 모두 제거되어 SausageHawaiian이 새 리스트에 한 번씩만 나타나는 것을 확인할 수 있습니다.

참고로 Python 3.7부터 딕셔너리는 삽입 순서를 유지하므로, dict.fromkeys() 방식은 원본 리스트의 순서를 그대로 보존한다는 장점이 있습니다.

set(집합)으로 중복 제거하기

Python의 set 객체는 순서가 없고(unordered) 인덱싱이 불가능한(unindexed) 자료구조입니다. 집합은 고유한 항목들의 컬렉션을 저장하며, 리스트와 달리 중복 값을 가질 수 없습니다.

따라서 집합이 중복 항목을 저장하지 못한다는 특성을 활용해, 리스트를 집합으로 변환하면 중복이 자동으로 제거됩니다. Python에서 집합은 중괄호({})로 감싼 쉼표 구분 항목 목록으로 표현됩니다. 피자 목록을 저장하는 집합의 예는 다음과 같습니다:

pizzas = {'Margherita', 'Hawaiian', 'Mushroom', 'Meat Feast'}

set으로 중복 제거 예제

앞선 예제를 활용해 집합으로 리스트의 중복 값을 제거하는 방법을 살펴보겠습니다.

피자 셰프가 기존 메뉴와 신메뉴를 병합하려는데, 두 메뉴 사이에 중복 항목이 있을 수 있습니다. 최종 메뉴를 만들기 전에 이 중복을 제거해야겠죠. 집합 방식을 사용한 코드는 다음과 같습니다:

new_menu = ['Hawaiian', 'Margherita', 'Mushroom', 'Prosciutto', 'Meat Feast', 'Hawaiian', 'Bacon', 'Black Olive Special', 'Sausage', 'Sausage']

final_new_menu = list(set(new_menu))

print(final_new_menu)

중복 값이 제거된 후의 리스트는 다음과 같습니다:

['Mushroom', 'Black Olive Special', 'Meat Feast', 'Bacon', 'Margherita', 'Sausage', 'Prosciutto', 'Hawaiian']

프로그램 시작 부분에서 새 메뉴의 모든 피자를 담은 new_menu 리스트를 선언합니다.

그다음 final_new_menu 변수를 선언하여 수정된 메뉴를 저장합니다. 이 변수는 set() 함수로 new_menu를 집합으로 변환한 뒤, list() 함수로 다시 리스트로 되돌립니다. 이 과정에서 new_menu의 모든 중복 값이 제거됩니다.

마지막으로 프로그램이 새 메뉴를 콘솔에 출력합니다. 원본 리스트의 고유한 요소들이 모두 나타나며, 중복 없는 깔끔한 리스트를 얻게 됩니다.

출력 결과를 보면 항목 순서가 원본과 달라진 것을 알 수 있습니다. 집합은 순서를 보장하지 않기 때문인데, 순서가 중요하다면 앞서 소개한 dict.fromkeys() 방식을 사용하는 것이 좋습니다.

마무리

리스트에서 중복 항목을 제거하는 것은 Python에서 매우 흔한 작업입니다. 공식적으로 지정된 단일 방법은 없지만, 가장 널리 쓰이는 접근 방식은 딕셔너리의 fromkeys() 함수를 사용하거나 데이터를 집합으로 변환하는 것입니다.

이 가이드에서는 딕셔너리 fromkeys() 함수와 집합(set)을 활용해 Python 리스트의 중복을 제거하는 방법을 알아보았습니다. 두 방식의 차이를 정리하면 다음과 같습니다:

  • dict.fromkeys(): 원본 리스트의 순서를 유지하면서 중복을 제거합니다.
  • set(): 간결하고 빠르지만 순서가 보장되지 않습니다.

상황에 맞는 방식을 선택해 활용해 보시기 바랍니다. Python 프로그래밍을 더 깊이 배우고 싶다면 관련 학습 가이드도 함께 참고해 보세요.