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

파이썬(Python)으로 리스트에서 부호가 바뀌는 인덱스 찾는 방법

리스트에 담긴 숫자들 사이에서 양수에서 음수로, 또는 음수에서 양수로 부호가 바뀌는 지점의 인덱스를 구해야 할 때가 있습니다. 이럴 때는 별도의 라이브러리 없이 간단한 for 반복문과 리스트의 append() 메서드만으로 손쉽게 해결할 수 있습니다.

예제 코드

아래는 리스트에서 부호가 바뀌는 인덱스를 찾는 전체 코드입니다.

my_list = [71, 24, -34, -25, -76, 87, 29, -60, 70, 8]

print("The list is :")
print(my_list)

my_result = []
for index in range(0, len(my_list) - 1):
    # 현재 값과 다음 값의 부호가 서로 다른 경우
    if (my_list[index] > 0 and my_list[index + 1] < 0) or \
       (my_list[index] < 0 and my_list[index + 1] > 0):
        my_result.append(index)

print("The result is :")
print(my_result)

실행 결과

The list is :
[71, 24, -34, -25, -76, 87, 29, -60, 70, 8]
The result is :
[1, 4, 6]

코드 설명

  • 먼저 숫자들이 담긴 리스트를 정의하고 콘솔에 출력합니다.

  • 결과를 저장할 빈 리스트 my_result를 생성합니다.

  • range(0, len(my_list) - 1)을 사용해 마지막 요소 앞까지만 반복하면서, 현재 인덱스의 값과 바로 다음 인덱스의 값을 나란히 비교합니다.

  • 두 값 중 하나는 양수이고 다른 하나는 음수라면, 즉 부호가 바뀌었다면 해당 인덱스를 결과 리스트에 추가(append)합니다.

  • 반복이 끝나면 부호가 바뀌는 모든 인덱스가 담긴 리스트를 콘솔에 출력합니다.

위 예제에서는 인덱스 1(24 → -34), 4(-76 → 87), 6(29 → -60)에서 부호가 바뀌므로 최종 결과는 [1, 4, 6]이 됩니다.

더 파이썬다운 방법: 리스트 컴프리헨션

같은 로직을 zip()과 리스트 컴프리헨션을 활용하면 한 줄로 깔끔하게 표현할 수 있습니다.

my_result = [i for i, (a, b) in enumerate(zip(my_list, my_list[1:])) if (a > 0) != (b > 0)]
print(my_result)  # [1, 4, 6]

zip(my_list, my_list[1:])은 인접한 두 요소를 짝지어 주고, (a > 0) != (b > 0) 조건으로 두 값의 부호가 서로 다른지 확인합니다. 코드가 짧고 가독성이 뛰어나 실무에서도 자주 사용되는 패턴입니다.

참고 사항

  • 값이 0인 경우에는 위 조건에서 부호 변화로 간주되지 않습니다. 0을 양수 또는 음수로 취급해야 한다면 조건식에 >=, <= 등을 상황에 맞게 수정해야 합니다.

  • 인접한 두 수를 곱했을 때 결과가 음수라면 두 수의 부호가 다르다는 성질을 이용해 my_list[index] * my_list[index + 1] < 0 조건으로도 동일한 결과를 얻을 수 있습니다.