리스트 안에서 모든 'y' 요소가 'x'보다 뒤에 위치하는지 확인해야 하는 경우가 종종 있습니다. 예를 들어, 데이터의 순서 규칙을 검증하거나 특정 조건을 만족하는지 점검할 때 유용합니다. 이럴 때 파이썬의 enumerate 함수와 조건문을 함께 사용하면 간단하게 해결할 수 있습니다.
동작 원리
핵심 아이디어는 다음과 같습니다. 먼저 'x'의 인덱스 위치를 구한 뒤, 리스트를 순회하면서 'y'가 발견될 때마다 그 인덱스가 'x'의 인덱스보다 앞인지 확인합니다. 만약 'x'보다 앞에 있는 'y'가 하나라도 존재한다면 조건을 만족하지 않는 것으로 판단합니다.
예제 코드
아래는 전체 동작 과정을 보여주는 예제입니다.
my_list = [11, 25, 13, 11, 64, 25, 8, 9]
print("The list is :")
print(my_list)
x, y = 13, 8
x_index = my_list.index(x)
my_result = True
for index, element in enumerate(my_list):
if element == y and index < x_index:
my_result = False
break
if(my_result == True):
print("All y elements occcur after x elements")
else:
print("All y elements don't occcur after x elements")실행 결과
The list is : [11, 25, 13, 11, 64, 25, 8, 9] All y elements occcur after x elements
코드 단계별 설명
정수 값들을 담은 리스트를 정의하고 콘솔에 출력합니다.
비교 대상이 될 두 정수 변수
x와y를 초기화합니다.index()메서드를 사용해 리스트에서 'x'의 인덱스 위치를 구해 변수에 저장합니다.결과를 저장할 임시 변수를 Boolean 값
True로 초기화합니다.enumerate를 사용해 리스트의 요소와 인덱스를 동시에 순회합니다.순회 중인 요소가 'y'와 같으면서, 해당 인덱스가 'x'의 인덱스보다 작다면 조건이 깨진 것이므로 임시 변수를
False로 변경합니다.break문으로 루프를 즉시 빠져나와 불필요한 반복을 줄입니다.마지막으로 임시 변수의 값에 따라 적절한 결과 메시지를 콘솔에 출력합니다.
더 간결한 대안: all() 함수 활용
위 로직은 all() 함수와 제너레이터 표현식을 사용하면 한 줄로도 작성할 수 있습니다.
x_index = my_list.index(x)
my_result = all(
index > x_index
for index, element in enumerate(my_list)
if element == y
)all() 함수는 제너레이터가 생성하는 모든 값이 True일 때만 True를 반환하므로, 'y' 중 하나라도 'x'보다 앞에 있으면 자동으로 False가 됩니다. 또한 'y'가 리스트에 존재하지 않는 경우에는 빈 시퀀스에 대해 True를 반환하므로, "모든 y가 x 이후에 있다"는 명제가 공집합에서도 성립한다는 수학적 관례와 일치합니다.
마무리
이처럼 enumerate와 조건문의 조합만으로도 리스트 내 요소들의 상대적 위치를 손쉽게 검증할 수 있습니다. 코드 가독성을 높이고 싶다면 all() 기반의 대안을, 디버깅이나 단계별 추적이 필요하다면 명시적인 for 루프 방식을 선택하면 좋습니다.