파이썬 리스트에서 특정 값 앞의 원소 개수 세기

파이썬 리스트에서 특정 값 앞의 원소 개수, 언제 필요할까?

리스트에서 “특정 값 앞에 있는 요소가 몇 개인지”를 알아야 하는 상황이 의외로 많습니다. 예를 들어 원하는 값까지 처리하고 멈추거나, 값 앞에 들어있는 데이터만 따로 추출해야 할 때가 그렇습니다. 이 글에서는 파이썬에서 리스트 안에 특정 값이 나올 때까지의 원소 개수를 안전하게 세는 방법과 실제 예제를 살펴봅니다. 파이썬 기초 문법(리스트, for문, 기본 메서드 등)만 알면 이해할 수 있습니다.

가장 기본적인 방법: index()로 위치 찾기

리스트에서 특정 값이 처음 나오는 위치(인덱스 번호)는 index() 메서드로 바로 알 수 있습니다. 이 값이 곧 “특정 값 앞의 원소 개수”가 됩니다. 아래는 가장 기본적인 예제입니다.

fruits = ['사과', '바나나', '오렌지', '키위']
value = '오렌지'
count = fruits.index(value)
print(count)

실행 결과

2

여기서 index()는 원하는 값이 몇 번째(0부터 시작)인지를 알려줍니다. 예제를 실행하면 2가 출력됩니다. 즉, '오렌지' 앞에는 2개의 원소(사과, 바나나)가 있음을 보여줍니다.

index()의 주의점: 값이 없거나 여러 번 나올 때

index()를 사용할 때는 리스트에 값이 반드시 있어야 합니다. 값이 없다면 ValueError가 발생합니다. 이런 상황을 방지하려면 다음처럼 코드를 보완할 수 있습니다.

fruits = ['사과', '바나나', '오렌지', '키위']
value = '포도'
if value in fruits:
    count = fruits.index(value)
    print(count)
else:
    print('값이 리스트에 없습니다.')

실행 결과

값이 리스트에 없습니다.

이렇게 하면 없는 값을 찾으려 할 때 오류 대신 안내 문구가 출력됩니다.

또, 값이 여러 번 등장하는 경우 index()는 가장 처음 나오는 위치만 돌려줍니다.

numbers = [2, 5, 3, 5, 7]
value = 5
count = numbers.index(value)
print(count)

실행 결과

1

위 코드는 1이 출력됩니다. 5가 두 번 나오지만 ‘앞의 원소 개수’는 첫 번째 5를 기준으로 합니다.

for문으로 직접 세기: 값이 여러 번 나오거나, 변형된 상황

값이 여러 번 등장할 때 두 번째, 세 번째 등장 위치까지 세고 싶을 수도 있습니다. 이럴 땐 for문과 enumerate()를 조합해 직접 순서대로 확인할 수 있습니다.

numbers = [2, 5, 3, 5, 7]
value = 5
positions = []
for i, v in enumerate(numbers):
    if v == value:
        positions.append(i)
print(positions)

실행 결과

[1, 3]

이 코드는 5가 나오는 모든 위치를 positions 리스트에 담습니다. 결과는 [1, 3]이 됩니다. 만약 두 번째 5 앞의 개수가 궁금하다면 positions[1]처럼 접근할 수 있습니다.

자주 하는 실수: 값이 맨 앞에 있거나 없을 때

리스트에서 값이 맨 앞에 있으면 index()가 0을 반환합니다. 즉, “앞에 원소가 0개”라는 뜻입니다. 이때 1을 빼거나 잘못 해석하면 오류가 나거나 논리가 틀어질 수 있습니다.

animals = ['개', '고양이', '토끼']
value = '개'
print(animals.index(value))  # 0이 출력되어야 정상입니다.

실행 결과

0

잘못된 예: 값을 찾으려다 없는 경우 예외가 발생합니다.

잘못된 예

animals = ['개', '고양이', '토끼']
value = '말'
print(animals.index(value))

수정 방법:

animals = ['개', '고양이', '토끼']
value = '말'
if value in animals:
    print(animals.index(value))
else:
    print('리스트에 값이 없습니다.')

실행 결과

리스트에 값이 없습니다.

슬라이싱으로 값 앞의 원소 자체를 추출하는 방법

값 앞의 원소를 가져오고 싶다면 슬라이싱(slicing)이 더 직관적일 수 있습니다.

fruits = ['사과', '바나나', '오렌지', '키위']
value = '오렌지'
if value in fruits:
    before = fruits[:fruits.index(value)]
    print(before)
else:
    print([])

실행 결과

['사과', '바나나']

이처럼 fruits[:fruits.index(value)]는 '오렌지' 앞 요소만 잘라서 새 리스트로 돌려줍니다. 값이 없으면 빈 리스트를 출력하게 처리했습니다.

핵심 정리와 연습 문제

정리:

  • 리스트에서 특정 값 앞의 원소 개수는 index() 메서드를 쓰면 구할 수 있습니다.
  • 값이 없을 때 ValueError가 나므로 in 연산자로 먼저 확인하면 안전합니다.
  • 값이 여러 번 있으면 index()는 첫 번째 등장 위치만 알려줍니다.
  • 슬라이싱을 이용하면 값 앞의 원소만 별도 리스트로 추출할 수 있습니다.

연습 문제

  1. 다음 리스트에서 'B' 앞에 있는 원소 개수를 출력하는 코드를 작성하세요.
    letters = ['A', 'C', 'B', 'D', 'E']
    # 여기에 코드를 작성해보세요.

    실행 결과

    (출력 없음)
  2. 리스트 [1, 3, 7, 7, 5, 7]에서 두 번째 7 앞의 원소 개수를 구하려면 어떻게 해야 할까요? 힌트: for문과 enumerate()를 활용해보세요.
  3. 리스트에 값이 없을 때 안전하게 처리하는 코드를 직접 짜보고, 빈 리스트가 나오게 해보세요.

이제 직접 코드를 실행해 보며 익혀보세요!