파이썬 리스트에서 요소의 인덱스 찾는 방법
이 안내서는 파이썬 리스트에서 특정 요소의 위치(인덱스)를 찾는 여러 가지 방법을 설명합니다. 반복문과 파이썬 내장 메소드인 index()
를 활용하여 목표를 달성할 수 있습니다.
파이썬 리스트를 다루다 보면 특정 항목이 리스트 내에서 어디에 위치하는지 알아야 할 때가 있습니다. 다음 두 가지 방법을 사용할 수 있습니다.
- 리스트를 순회하면서 각 항목이 찾으려는 값과 일치하는지 확인합니다.
- 파이썬 내장 리스트 메소드인
index()
를 사용합니다.
본 튜토리얼에서는 위의 두 가지 방법을 모두 자세히 살펴보겠습니다. 함께 시작해볼까요? 👩🏽💻
파이썬 리스트의 재조명
파이썬에서 리스트는 여러 항목들의 모음입니다. 이 항목들은 동일한 데이터 유형일 수도 있고, 서로 다른 유형일 수도 있습니다. 리스트는 가변적인(mutable) 데이터 구조이므로, 생성 후에도 내용을 수정할 수 있습니다.
예를 들어, 5가지 과일로 이루어진 리스트를 생각해 봅시다.
fruits = ["apple", "mango", "strawberry", "pomegranate", "melon"]
len()
함수를 사용하여 파이썬 객체의 길이를 알 수 있습니다. 따라서 len()
함수에 과일 리스트를 인수로 전달하면 리스트의 길이를 얻을 수 있습니다.
len(fruits) # 출력: 5
이 튜토리얼에서는 위에서 정의한 과일 리스트를 예제로 계속 사용하겠습니다.
파이썬 리스트의 인덱싱
파이썬은 제로-인덱싱을 사용합니다. 즉, 리스트와 같은 반복 가능한(iterable) 객체에서 첫 번째 요소는 인덱스 0에, 두 번째 요소는 인덱스 1에 위치합니다. 만약 리스트의 길이가 k라면, 마지막 요소는 인덱스 k-1에 위치합니다.
파이썬의 range()
함수를 사용하여 반복문과 함께 각 요소의 인덱스를 얻을 수 있습니다.
참고: range(k)
를 반복하면 0, 1, 2, …, (k-1)과 같은 인덱스를 얻습니다. 따라서 k를 리스트의 길이로 설정하면, 유효한 모든 인덱스 값을 얻을 수 있습니다.
다음은 range()
함수를 사용한 예시입니다.
for i in range(len(fruits)): print(f"i:{i}, fruit[{i}] is {fruits[i]}") # 출력 i:0, fruit[0] is apple i:1, fruit[1] is mango i:2, fruit[2] is strawberry i:3, fruit[3] is pomegranate i:4, fruit[4] is melon
이제 파이썬 리스트의 기본적인 사항을 이해했으니, 리스트에서 특정 항목의 인덱스를 찾는 다양한 방법을 알아보겠습니다.
for 루프를 이용한 반복으로 리스트 항목의 인덱스 찾기
이전 섹션에서 사용한 과일 리스트를 다시 활용해 보겠습니다. for 루프를 사용하여 리스트에서 특정 항목의 인덱스를 찾는 방법을 알아보겠습니다.
for 루프와 range()
함수 사용
먼저 찾고자 하는 값을 target
변수에 지정해 보겠습니다.
for 루프와 range()
함수를 사용하여 0부터 len(fruits) - 1
까지의 인덱스 목록을 생성할 수 있습니다.
- 과일 리스트를 순회하면서 각 인덱스에 접근합니다.
- 현재 인덱스
i
에 있는 요소가target
값과 같은지 확인합니다. - 만약 같다면, 인덱스
i
에서target
값이 발견되었음을 출력합니다.
fruits = ["apple","mango","strawberry","pomegranate","melon"] target = "mango" for i in range(len(fruits)): if fruits[i] == target: print(f"{target} found at index {i}") # 출력 mango found at index 1
이 예시에서는 target
문자열 ‘mango’가 과일 리스트에서 한 번만(인덱스 1에서) 나타납니다.
하지만 때로는 target
값이 두 번 이상 나타나거나 아예 나타나지 않을 수도 있습니다. 이러한 경우를 처리하기 위해 위의 반복문을 수정하고, find_in_list
라는 함수 안에 내용을 래핑합니다.
함수 정의 이해하기
find_in_list
함수는 두 개의 매개변수를 가집니다.
target
: 찾고자 하는 값py_list
: 검색할 파이썬 리스트
def find_in_list(target, py_list): target_indices = [] for i in range(len(py_list)): if py_list[i] == target: target_indices.append(i) if not target_indices: print("Sorry, target not found!") else: print(f"{target} is found at indices {target_indices}")
함수 내부에서 빈 리스트인 target_indices
를 초기화합니다. 그리고 리스트를 순회하면서, 특정 인덱스에서 target
이 발견되면 append()
메소드를 사용하여 해당 인덱스를 target_indices
리스트에 추가합니다.
참고: 파이썬에서 list.append(item)
은 item
을 리스트의 맨 끝에 추가합니다.
- 만약
target
을 찾을 수 없다면target_indices
는 빈 리스트입니다. 이 경우, 사용자에게target
이 리스트에 없다는 메시지를 출력합니다. - 만약
target
이 하나 이상의 인덱스에서 발견된다면,target_indices
는 해당 인덱스들을 모두 포함합니다.
다음으로, 과일 리스트를 아래와 같이 다시 정의해 보겠습니다.
이번에는 인덱스 1과 4에서 두 번 나타나는 문자열 ‘mango’를 찾아보겠습니다.
fruits = ["apple","mango","strawberry","pomegranate","mango","melon"] target = "mango" find_in_list(target, fruits) # 출력 mango is found at indices [1, 4]
target
과 fruits
를 인수로 사용하여 find_in_list
함수를 호출하면, 두 인덱스가 모두 반환되는 것을 확인할 수 있습니다.
target = "turnip" find_in_list(target, fruits) # 출력 Sorry, target not found!
과일 리스트에 존재하지 않는 ‘turnip’을 검색하면, 대상을 찾을 수 없다는 메시지가 출력됩니다.
for 루프와 enumerate()
함수 사용
파이썬에서는 enumerate()
함수를 사용하여 range()
함수를 사용하는 대신, 인덱스와 항목에 동시에 접근할 수 있습니다.
다음 코드는 enumerate()
함수를 사용하여 인덱스와 값을 동시에 가져오는 방법을 보여줍니다.
fruits = ["apple","mango","strawberry","pomegranate","mango","melon"] for index, fruit in enumerate(fruits): print(f"Index {index}: {fruit}") # 출력 Index 0: apple Index 1: mango Index 2: strawberry Index 3: pomegranate Index 4: mango Index 5: melon
이제 enumerate()
함수를 사용하여 리스트에서 항목의 인덱스를 찾는 파이썬 함수를 다시 작성해 보겠습니다.
def find_in_list(target, py_list): target_indices = [] for index, fruit in enumerate(py_list): if fruit == target: target_indices.append(index) if not target_indices: print("Sorry, target not found!") else: print(f"{target} is found at indices {target_indices}")
이전과 마찬가지로, 유효한 인수를 사용하여 find_in_list
함수를 호출할 수 있습니다.
위의 함수 정의를 리스트 컴프리헨션으로 변환할 수 있습니다. 다음 섹션에서 이를 알아보겠습니다.
리스트 컴프리헨션을 사용한 반복으로 리스트 항목의 인덱스 찾기
파이썬의 리스트 컴프리헨션을 사용하면 기존 리스트에서 특정 조건에 따라 새로운 리스트를 생성할 수 있습니다. 일반적인 리스트 컴프리헨션의 형태는 다음과 같습니다.
new_list = [<표현식> for <항목> in <반복 가능한 객체> if <조건>]
위 그림은 리스트 컴프리헨션의 각 요소가 어떻게 표현되는지 보여줍니다. 이를 활용하여 find_in_list
함수를 리스트 컴프리헨션으로 변환할 수 있습니다.
target
의 인덱스를 생성하는 리스트 컴프리헨션 표현식은 다음과 같습니다.
target_indices = [index for index, fruit in enumerate(fruits) if fruit == target]
연습 삼아 위의 코드를 몇 가지 다른 예시에 적용해 보시기 바랍니다.
index()
메소드를 사용하여 리스트 항목의 인덱스 찾기
파이썬 리스트에서 항목의 인덱스를 찾는 데 내장된 .index()
메소드를 사용할 수도 있습니다. 일반적인 구문은 다음과 같습니다.
list.index(value, start, end)
위 메소드의 파라미터는 다음과 같습니다.
value
: 찾고자 하는 값start
,end
: 선택적인 위치 인자입니다. 이 인자들은 리스트의 일부분(슬라이스) 내에서value
의 인덱스를 검색할 때 사용될 수 있습니다. 이때 검색 범위는start
에서 시작하여end
직전까지 확장됩니다.
참고: .index()
메소드는 리스트에서 값이 처음 나타나는 인덱스만을 반환합니다. 만약 리스트 슬라이스에서 항목의 인덱스를 찾는 경우에도, [start:end-1]
범위에서 해당 값이 처음 나타나는 인덱스만 반환합니다.
.index()
메소드가 어떻게 동작하는지 이해하기 위해 예시를 다시 살펴보겠습니다.
fruits = ["apple","mango","strawberry","pomegranate","mango","melon"] target = "mango" fruits.index(target) # 출력: 1
과일 리스트에 ‘mango’가 두 번 나타났지만, 처음 나타난 인덱스만 반환된 것을 확인할 수 있습니다.
두 번째로 나타나는 ‘mango’의 인덱스를 얻으려면 아래와 같이 인덱스 2에서 시작하여 인덱스 5 직전까지 확장되는 리스트 슬라이스를 검색해야 합니다.
fruits.index(target, 2, 5) # 출력: 4
파이썬에서 ValueError
처리하는 방법
이제 리스트에 없는 항목(예: ‘carrot’)의 인덱스를 찾으려고 하면 어떻게 되는지 살펴보겠습니다.
target = "carrot" fruits.index(target) # 출력 --------------------------------------------------------------------------- ValueError Traceback (most recent call last) <ipython-input-17-81bd454e44f7> in <module>() 1 target = "carrot" 2 ----> 3 fruits.index(target) ValueError: 'carrot' is not in list
위의 코드 셀에서 볼 수 있듯이, ValueError
가 발생합니다. 파이썬에서는 try
및 except
블록을 사용하여 이러한 예외를 처리할 수 있습니다.
try-except
블록의 일반적인 구문은 다음과 같습니다.
try: # 예외가 발생할 가능성이 있는 코드 except <오류 유형>: # <오류 유형>이 발생했을 때 처리할 코드
위의 try-except
블록을 사용하여 ValueError
를 예외로 처리할 수 있습니다.
target = "carrot" try: fruits.index(target) except ValueError: print(f"Sorry, could not find {target} in list") # 출력 Sorry, could not find carrot in list
위 코드는 다음과 같은 기능을 수행합니다.
target
이 리스트에 있으면 해당target
의 인덱스를 반환합니다.- 만약
target
이 없다면,ValueError
를 예외로 처리하고 오류 메시지를 출력합니다.
요약
다음은 파이썬 리스트에서 항목의 인덱스를 찾는 다양한 방법에 대한 요약입니다.
- 파이썬의
for
루프와range()
함수를 사용하여 각 항목과 해당 인덱스를 가져올 수 있습니다. 그 후, 인덱스의 항목이 찾고자 하는target
과 일치하는지 확인할 수 있습니다. enumerate()
함수를 사용하여 항목과 인덱스에 동시에 접근할 수도 있습니다.- 위에서 설명한 두 가지 방법은 리스트 컴프리헨션 내에서도 사용할 수 있습니다.
- 리스트에서 항목의 인덱스를 찾기 위해 내장된
.index()
메소드를 사용할 수도 있습니다. list.index(value)
는 리스트에서value
가 처음 나타나는 인덱스를 반환합니다. 만약value
가 없으면ValueError
가 발생합니다.list.index(value, start, end)
를 사용하여 리스트의 특정 슬라이스[start:end-1]
내에서value
의 인덱스를 찾을 수 있습니다.
다음으로, 파이썬 딕셔너리를 키 또는 값을 기준으로 정렬하는 방법을 배우겠습니다. 즐거운 파이썬 프로그래밍 되세요!