본문 바로가기
Python/Data Structure

[Python] 하나의 리스트를 index에 따라 쪼개기

by 전봇대파괴자 2021. 8. 26.

이번에는 하나의 커다란 리스트를 index에 따라 여러 리스트로 쪼개는 방법을 알아보겠습니다.

 

코딩을 하다 보면 원래 나눠졌어야 할 값들이 한 리스트에 다 모여있는 경우가 심심치 않게 있습니다. 

특히 index로 나눠야 할 때가 있죠. 예를 들면 짝수 index에 있는 값들만, 홀수 index에 있는 값들만 각각 모아서 리스트로 만들고 싶은데 어떻게 해야 할지 모르겠다. 그럴 때 간단히 쓸 수 있는 방법이 있습니다. 

 

우선 예시로 샘플 리스트 하나를 만들어 보겠습니다. 

# 샘플 리스트 만들기
sample_list = [i for i in range(1000)]
print(sample_list)

>> [0, 1, 2, 3, 4, 5.....998, 999, 1000]

 

여기서 index에 따라 짝수 index를 가진 리스트, 홀수 index를 가진 리스트로 분리하려면 아래와 같이 하면 됩니다. 

# 홀수 index를 가진 값들, 짝수 index를 가진 값들 분리
odd_idx_list, even_idx_list = sample_list[::2], sample_list[1::2]

print('odd_idx_list: {}'.format(odd_idx_list))
print('even_idx_list: {}'.format(even_idx_list))

>> odd_idx_list: [0, 2, 4, 6, 8, 10, 12, 14....994, 996, 998]
>> even_idx_list: [1, 3, 5, 7, 9, 11, 13, 15.... 995, 997, 999]

 

음, 이렇게 하니까 헷갈릴 수가 있겠네요. 다시 만들어 볼게요.

 

# 다른 샘플 리스트
sample_list = [i for i in range(1, 1000)]
print(sample_list)

>> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10...997, 998, 999]

# 홀수/짝수 index로 리스트 나누기
odd_idx_list, even_idx_list = sample_list[::2], sample_list[1::2]

print('홀수 인덱스 값들 모음: {}'.format(odd_idx_list))
print('짝수 인덱스 값들 모음: {}'.format(even_idx_list))

>> 홀수 인덱스 값들 모음: [1, 3, 5, 7, 9, 11, 13...995, 997, 999]
>> 짝수 인덱스 값들 모음: [2, 4, 6, 8, 10, 12, 14...994, 996, 998]

 

보시다시피 매우 간단합니다. 

하지만 된 건 좋은데, 왜 이렇게 되는 걸까요? 

 

print(sample_list[::2]) # idx 간격 2
print(sample_list[::3]) # idx 간격 3
print(sample_list[::4]) # idx 간격 4

>> [1, 3, 5, 7, 9, 11, 13...]
>> [1, 4, 7, 10, 13, 16, 19...]
>> [1, 5, 9, 13, 17, 21, 25...]

 

가장 끝의 숫자는 리스트 안 값들의 간격을 나타냅니다. 

그렇다면 가장 앞의 숫자는 무슨 뜻일까요?

 

print(sample_list[1::2]) # idx 1인 값부터 시작
print(sample_list[2::2]) # idx 2인 값부터 시작
print(sample_list[3::2]) # idx 3인 값부터 시작

>> [2, 4, 6, 8, 10, 12...]
>> [3, 5, 7, 9, 11, 13...]
>> [4, 6, 8, 10, 12, 14...]

 

가장 앞에 있는 숫자는 시작하는 값의 인덱스를 말합니다. 

여기까지 오면 가운데의 숫자는 뭘 나타내는 것일지 짐작이 가시죠? 

 

print(sample_list[:10:2]) # idx 10인 수까지
print(sample_list[:20:2]) # idx 20인 수까지
print(sample_list[:30:2]) # idx 30인 수까지

>> [1, 3, 5, 7, 9]
>> [1, 3, 5, 7, 9, 11, 13, 15, 17, 19]
>> [1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29]

 

아래 코드를 보면 더 이해가 쉽습니다.

 

print(sample_list[:10:])
print(sample_list[:20:])
print(sample_list[:30:])

>> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20]
>> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30]

 

가운데의 값은 '~까지'를 말합니다. 

sample_list[:10:2]를 해석하면 인덱스가 10인 수까지, 2 간격을 가지는 값들만 고르라는 말입니다. 

 

# Python Extended Slices
# 대상 리스트[범위 시작하는 인덱스: 범위가 끝나는 인덱스 : 인덱스 간격]
# ex) sample_list[1::2] => 인덱스가 1인 값부터 리스트 가장 끝값까지 2 간격으로 있는 수들을 모아 리스트로 만들기

print(sample_list[:::]) # 리스트 전체

>> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10...997, 998, 999]

 

위의 예시에서 알 수 있듯, 시작값을 지정하지 않으면 리스트의 가장 처음부터 리스트에 포함시킵니다. 

또 건너뛸 인덱스 간격을 따로 지정하지 않으면 간격은 자동으로 1이 되죠. 

가운데 값을 지정하지 않을 경우, 자동으로 리스트의 가장 끝까지를 범위로 설정합니다.