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

파이썬에서 리스트가 엄격하게 증가하는지 확인하는 방법

리스트를 다루다 보면 요소들이 일정한 순서를 따르고 있는지 확인해야 하는 경우가 자주 있습니다. 이 글에서는 리스트의 요소들이 엄격하게 증가하는 순서, 즉 모든 요소가 바로 앞 요소보다 항상 큰 값으로 배치되어 있는지 확인하는 방법을 소개합니다.

방법 1: all()과 zip() 조합하기

이 방식은 원본 리스트와 한 칸씩 밀어낸 슬라이스(list[1:])를 zip()으로 묶어 인접한 두 요소를 짝지은 뒤, 모든 쌍에서 앞 요소가 뒤 요소보다 작은지(i < j) 검사합니다. all() 함수는 모든 비교가 참일 때만 True를 반환하므로, 결과가 True라면 해당 리스트는 엄격하게 증가하는 순서라고 판단할 수 있습니다.

예제 코드

listA = [11,23,42,51,67]
# 주어진 리스트
print("Given list : ",listA)
# all과 zip 적용
if (all(i < j for i, j in zip(listA, listA[1:]))):
    print("Yes, List is sorted.")
else:
    print("No, List is not sorted.")
# 다시 확인
listB = [11,23,21,51,67]
print("Given list : ",listB)
# all과 zip 적용
if (all(i < j for i, j in zip(listB, listB[1:]))):
    print("Yes, List is sorted.")
else:
    print("No, List is not sorted.")

실행 결과

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

Given list : [11, 23, 42, 51, 67]
Yes, List is sorted.
Given list : [11, 23, 21, 51, 67]
No, List is not sorted.

첫 번째 리스트는 모든 요소가 이전 요소보다 크기 때문에 "정렬됨"으로 판정되지만, 두 번째 리스트에서는 23 다음에 21이 오므로 엄격한 증가 조건을 만족하지 못합니다.

방법 2: itertools.starmap() 활용하기

itertools.starmap()은 반복 가능한 객체에서 가져온 인자들을 지정된 함수에 전달해 결과를 계산하는 이터레이터를 생성합니다. 슬라이싱한 리스트 두 개를 zip()으로 묶은 뒤, 각 쌍을 비교 연산자 함수에 적용하는 방식입니다. 아래 예제에서는 문자열 리스트를 사용했습니다.

참고: 아래 코드에서는 operator.le(작거나 같음)를 사용하고 있습니다. 이 경우 인접한 요소가 서로 같아도 통과되므로, 엄격한 증가가 아닌 '비감소(내림하지 않는) 순서'를 검사하게 됩니다. 엄격한 증가 여부만 확인하려면 operator.lt(미만)로 바꿔 사용하면 됩니다.

예제 코드

import operator
import itertools

listA = ['Mon','Tue','Sun']
# 주어진 리스트
print("Given list : ",listA)
# starmap과 zip 적용
if all(itertools.starmap(operator.le,
    zip(listA, listA[1:]))):
    print("Yes, List is sorted.")
else:
    print("No, List is not sorted.")
# 다시 확인
listB = ['Mon','Sun','Tue']
print("Given list : ",listB)
# starmap과 zip 적용
if all(itertools.starmap(operator.le,
    zip(listB, listB[1:]))):
    print("Yes, List is sorted.")
else:
    print("No, List is not sorted.")

실행 결과

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

Given list : ['Mon', 'Tue', 'Sun']
No, List is not sorted.
Given list : ['Mon', 'Sun', 'Tue']
Yes, List is sorted.

'Mon' → 'Tue' → 'Sun'은 알파벳 순서가 아니므로 정렬되지 않은 것으로 판정되며, 'Mon' → 'Sun' → 'Tue'는 사전순으로 증가하므로 정렬된 것으로 판정됩니다. 이처럼 비교 연산자는 숫자뿐 아니라 문자열 등 비교 가능한 모든 자료형에 동일하게 적용됩니다.