개요
리스트 안의 각 행(내부 리스트)에서 인접한 요소들 사이의 차이가 모두 동일한, 즉 등차수열 형태를 이루는 행만 골라내야 하는 경우가 있습니다. 이럴 때는 반복문과 플래그(flag) 변수를 활용하면 간단하게 해결할 수 있습니다.
예제 코드
아래는 전체 예제 코드입니다.
my_list = [[31, 27, 10], [8, 11, 12], [11, 12, 13], [6, 9, 10]]
print("The list is :")
print(my_list)
my_result = []
for row in my_list:
temp = True
for index in range(0, len(row) - 1):
if row[index + 1] - row[index] != row[1] - row[0]:
temp = False
break
if temp:
my_result.append(row)
print("The resultant list is :")
print(my_result)실행 결과
The list is : [[31, 27, 10], [8, 11, 12], [11, 12, 13], [6, 9, 10]] The resultant list is : [[11, 12, 13]]
코드 설명
여러 개의 행을 담고 있는 리스트를 정의하고 콘솔에 출력합니다.
결과를 저장할 빈 리스트를 하나 생성합니다.
바깥 반복문으로 리스트의 각 행을 순회하면서, 해당 행이 조건을 만족하는지 판단하기 위한 변수를 True로 초기화합니다.
안쪽 반복문으로 행 내부의 인덱스를 순회합니다.
인접한 두 요소의 차이가 첫 번째 요소와 두 번째 요소의 차이와 다르다면, 해당 행은 등차수열이 아니므로 변수를 False로 변경합니다.
조건이 깨졌으므로 break 문으로 안쪽 반복문을 즉시 빠져나와 불필요한 연산을 줄입니다.
안쪽 반복문이 끝난 뒤 변수 값이 여전히 True라면, 그 행은 모든 요소의 차이가 일정하다는 의미이므로 결과 리스트에 추가합니다.
최종 결과 리스트가 콘솔에 출력됩니다. 위 예제에서는 [11, 12, 13]만 공통 차이(1)를 가지므로 이 행만 추출됩니다.
더 간결한 대체 방법
같은 로직은 파이썬 내장 함수 all()과 리스트 컴프리헨션을 사용하면 한 줄로도 작성할 수 있습니다.
my_result = [row for row in my_list
if all(row[i + 1] - row[i] == row[1] - row[0]
for i in range(len(row) - 1))]이 방식은 가독성이 좋고 코드 길이를 크게 줄여 주므로, 간단한 필터링 작업에는 플래그 변수 없이 이 방법을 사용하는 것도 좋은 선택입니다.