리스트에서 부호가 같은 연속된 요소들을 하나의 그룹으로 묶어야 하는 경우, 비트 단위 XOR 연산을 수행하는 '^' 연산자와 'enumerate' 함수를 활용한 간단한 반복문으로 손쉽게 해결할 수 있습니다.
아래 예제를 통해 구체적인 동작 방식을 살펴보겠습니다.
예제 코드
my_list = [15, -33, 12, 64, 36, -12, -31, -17, -49, 12, 43, 30, -23, -35, 53]
print("The list is :")
print(my_list)
my_result = [[]]
for (index, element) in enumerate(my_list):
if element ^ my_list[index - 1] < 0:
my_result.append([element])
else:
my_result[-1].append(element)
print("The result is :")
print(my_result)실행 결과
The list is : [15, -33, 12, 64, 36, -12, -31, -17, -49, 12, 43, 30, -23, -35, 53] The result is : [[15], [-33], [12, 64, 36], [-12, -31, -17, -49], [12, 43, 30], [-23, -35], [53]]
코드 설명
정수 값들이 담긴 리스트를 정의한 뒤 콘솔에 출력합니다.
결과를 저장할 빈 2차원 리스트(리스트 안의 리스트)를 초기화합니다.
'enumerate' 함수로 리스트를 순회하면서, 현재 요소와 바로 앞 요소에 '^'(XOR) 연산을 적용합니다. 두 수의 부호가 서로 다르면 XOR 결과가 음수가 되므로, 이를 조건으로 활용해 부호 변화 지점을 감지합니다.
부호가 바뀌는 지점이라면 새로운 하위 리스트를 만들고 해당 요소를 추가하여 새 그룹을 시작합니다.
부호가 이전 요소와 같다면, 현재 마지막 하위 리스트의 끝에 요소를 이어서 추가합니다.
모든 순회가 끝나면 부호별로 묶인 그룹들의 리스트가 완성되며, 이를 콘솔에 출력합니다.
핵심 포인트
'^' 연산자는 두 정수의 부호 비트를 비교하는 데 유용하게 쓰입니다. 서로 부호가 다른 두 수를 XOR하면 결과값의 최상위 비트가 1이 되어 음수가 되는데, 이 성질 덕분에 별도의 부호 검사 로직 없이도 한 줄의 조건문으로 부호 변화를 판별할 수 있습니다. 다만 첫 번째 요소를 처리할 때 인덱스 -1이 마지막 요소를 참조한다는 점은 상황에 따라 주의해서 사용해야 합니다.