리스트 안에 있는 두 요소(x, y) 중 서로 가장 가까운 위치를 찾아야 할 때가 있습니다. 이럴 때는 세 개의 매개변수를 받는 함수를 정의하고, not in 연산자와 리스트 컴프리헨션(list comprehension)을 활용하면 간단하게 결과를 구할 수 있습니다.
아래에서 실제 동작 과정을 살펴보겠습니다.
예제 코드
def nearest_occurence_list(my_list, x, y):
if x not in my_list or y not in my_list:
return -1
x_index = [index for index in range(len(my_list)) if my_list[index] == x]
y_index = my_list.index(y)
min_dist = 1000000
result = None
for element in x_index:
if abs(element - y_index) < min_dist:
result = element
min_dist = abs(element - y_index)
return result
my_list = [12, 24, 15, 17, 28, 26, 13, 28, 14, 12, 20, 19, 24, 29, 14]
print("The list is :")
print(my_list)
x = 14
print("The value of x is ")
print(x)
y = 26
print("The value of y is ")
print(y)
print("The result is :")
print(nearest_occurence_list(my_list, x, y))실행 결과
The list is : [12, 24, 15, 17, 28, 26, 13, 28, 14, 12, 20, 19, 24, 29, 14] The value of x is 14 The value of y is 26 The result is : 8
코드 설명
nearest_occurence_list라는 이름의 메서드가 정의되며, 리스트와 비교할 두 값(x, y)까지 총 세 개의 매개변수를 받습니다.not in연산자로 x 또는 y가 리스트에 존재하지 않는지 먼저 확인하고, 없다면 -1을 반환합니다.리스트 컴프리헨션을 사용해 리스트를 순회하면서 x와 값이 일치하는 모든 인덱스를 수집합니다.
수집된 인덱스 목록은 변수에 저장되어 이후 비교에 사용됩니다.
y의 첫 번째 인덱스는
index()메서드를 통해 구합니다.x의 인덱스 목록을 하나씩 순회하면서, 각 인덱스와 y의 인덱스 사이의 절댓값 거리를 계산합니다.
계산된 거리가 기존 최솟값보다 작으면 해당 인덱스를 결과로 저장하고 최솟값을 갱신합니다.
모든 순회가 끝나면 y의 위치에서 가장 가까운 x의 인덱스가 반환됩니다.
메서드 외부에서는 예제용 리스트를 정의하고 콘솔에 출력합니다.
x와 y에 사용할 값(각각 14와 26)을 정의한 뒤 콘솔에 출력합니다.
필요한 매개변수를 전달하여 메서드를 호출하고 그 결과를 출력합니다.
이 예제에서 26은 인덱스 5에 있고, 14는 인덱스 8과 14에 있습니다. 이 중 인덱스 8이 더 가깝기 때문에 최종 결과로 8이 출력됩니다.