파이썬 리스트 홀수번째 - paisseon liseuteu holsubeonjjae

#1. 리스트에서 요소를 추출하는 방법

일반적으로 리스트에서 요소를 추출하려면 인덱스 번호를 활용한다. 예를 들어 a_list=['one','two','three','four','five']라는 리스트가 있을 때 a_list[0]과 같이 리스트 명을 쓰고 [ ] 괄호 안에 인덱스 번호를 적어 print(a_list[0])을 실행하면 해당 인덱스 번호에 해당하는 'one'이라는 원소가 출력이 된다. 참고로 파이썬에서 리스트의 인덱스 번호는 0부터 시작한다.

슬라이싱이라는 기법으로 몇번째부터 몇번째까지의 원소를 출력할 수도 있다. a_list[0:2]와 같이 인덱스 번호 대신 "0 콜론 2"를 [ ] 괄호 안에 입력할 경우, 0번째부터 2번째 전까지의 원소들을 출력해 준다. 즉 'one', 'two'가 출력이 된다.

#2. 리스트에서 홀수번째 혹은 짝수번째 요소만 추출하는 방법은 없을까?

그렇다면, 홀수번째 혹은 짝수번째 요소만 추출하는 방법은 없을까? 매번 순서대로만 요소를 추출하지 않기 때문이다. 이런 경우에는 슬라이싱을 할 때 [시작 인덱스값 :: 인덱스 간격값]을 설정해서 리스트를 슬라이싱하는 방법을 사용하면 된다.

아래와 같이 a_list[0::2]의 의미는 a_list의 0번째 인덱스부터 2의 간격의 인덱스들의 요소들을 추출하라는 의미이다. 즉, 이 방법을 통해 0, 2, 4 ... 인덱스들의 요소들을 출력할 수 있다. 

이에 따라 리스트의 홀수번째 요소를 추출하고 싶은 경우, 리스트[1::2]를 하면 되고, 짝수번째 요소를 추출하고 싶은 경우, 리스트[0::2]를 하면 되는 것이다.

파이썬 리스트 홀수번째 - paisseon liseuteu holsubeonjjae
파이썬 홀수번째, 짝수번째 요소만 추출하기

이를 응용해서 0번째 원소로부터 3의 간격으로 원소를 추출하고 싶은 경우, 4의 간격으로 원소를 추출하고 싶은 경우 각각 리스트[0::3], [0::4]를 하면 된다. 몇번째 원소부터 시작할 것인지, 몇의 간격으로 원소를 추출할 것인지 값을 정해서 넣기만 하면 리스트에서 원소를 추출할 때 다양하게 활용할 수 있다.

#3. 숫자 원소인 경우, 처음부터 홀수 리스트 혹은 짝수 리스트를 만들 수 있다.

숫자 원소인 경우라면 처음부터 홀수 리스트, 짝수 리스트를 만드는 방법도 있다. list와 range 함수를 사용하면 간단하게 리스트를 만들 수 있다. list(range(처음시작할 원소값, 끝날 원소값+1, 원소들 사이의 간격값))으로 정의할 수 있다. 아래 코드를 보면 좀 더 쉽게 이해할 수 있다.

파이썬 리스트 홀수번째 - paisseon liseuteu holsubeonjjae
list, range함수로 간격이 일정한 리스트 만들기

0부터 9까지 원소를 구하는데 그 간격을 1로 하는 경우 list(range(0,10,1))로 코드를 작성하면 되고, 위와 같이 출력 결과를 확인할 수 있다. 여기서 주의할 점은 파라미터를 입력할 때 원하는 원소의 끝값 더하기 1을 해주어야 한다는 점이다. 따라서 입력하는 파라미터가 9가 아닌 10이 입력되어야 0~9까지 원소가 들어간 리스트를 만들 수가 있다.

그 밖에 원소 간격을 2, 3, 4 등 여러가지 값을 넣어서 다양한 간격의 리스트를 만드는데 활용할 수 있다.

"이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."

list = [1, 2, 3, 4, 5, 6, 7, 8]


# 짝수 index만 - (0, 2, 4, 6 ...)
>>> list[0::2]
[1, 3, 5, 7]

# 홀수 index - (1, 3, 5, 7 ...)
>>> list[1::2]
[2, 4, 6, 8]



# 4로 나눈 후, 첫번째 index
>>> list[0::4]
[1, 5]

# 4로 나눈 후,두번째 index
>>> list[1::4]
[2, 6]

# 4로 나눈 후, 3번째 index
>>> list[2::4]
[3, 7]

list[idx::n]

n   : list를 몇개로 나눌 것인지

idx : 나눈 후에 원하는 인덱스 (idx < n)

맨 위에 예시들을 보면 쉬우니 예시를 보고 참고하면 좋겠다!

코드를 수정하던 중 짝수와 홀수에 해당하는 인덱스만 뽑아야했다.

for문을 적용하는 방법 말고 다른 방법을 찾아보다가 위와 같이 인덱싱하는 방법을 찾을 수 있었다.

짝수, 홀수 말고도 list를 n만큼 나누어서 원하는 위치를 고를 수 있다.

파이썬 코드를 깔끔히 짜는데에 유용할 것 같다.

앱피아

Python/Python 응용

파이썬[Python] 리스트 짝수, 홀수번째 아이템 출력 - 나눗셈, 나머지, 몫 구하기(divmod) 이용

끔손 2020. 5. 4. 07:08

종종 리스트에서 특정 항목들에 대해서 출력을 하고자 할 때가 있습니다. 그 대표적인 경우가 짝수 번째, 홀수 번째 아이템을 출력하는 경우가 많습니다. 그래서 이번 포스팅에서는 리스트의 항목중에 짝수 , 홀수 아이템을 출력하는 방법에 대해서 다루고자 합니다. 여기에서는 나눗셈(/), 나머지(%), 몫을 구하는 연산자(divmod)를 활용해보도록 하겠습니다. 

먼저 나머지와 몫을 구하는 부분에 대해서 다루어 보고자 합니다. 상당수 많은 언어에서는 몫과 나머지를 구할 때 '/'와 '%'를 사용합니다. 물론 파이썬[Python]에서도 가능합니다. 이에 더불어 몫과 나머지를 한번에 구할 수 있는 divmod를 제공합니다. 

그럼 먼저 '/'와 '%'를 사용해서 몫과 나머지를 구해보도록 하겠습니다. 다음을 한번 살펴보겠습니다. 

>>>12/4

3.0

>>>12%4

0

>>>12%5

2

cs

위와 같이 '/'와 '%'를 이용해서 몫과 나머지를 구해봤습니다. 그럼 이번에는 divmod를 사용해보도록 하겠습니다. 

>>>divmod(12,3)

(40)

>>>divmod(3,12)

(03)

cs

위에서 보이는 바와 같이 divmod(A, B)는 A/B와 동일하고 결과는 (몫, 나머지) 형태로 반환됩니다. 그럼 /, %를 사용하는 것과 divmod를 사용하는 것의 성능 차이를 한번 비교 해보겠습니다. 

import timeit

print(timeit.timeit('divmod(n, d)''n, d = 2**74207281 - 1, 26', number=100))

print(timeit.timeit('n // d, n % d''n, d = 2**74207281 - 1, 26', number=100))

print(timeit.timeit('n // d, n % d''n, d = 2**74207281 - 1, 26', number=100))

print(timeit.timeit('divmod(n, d)''n, d = 2**74207281 - 1, 26', number=100))

cs

위의 결과를 해보면 다음과 같은 결과가 나옵니다. 

3.0605885

6.198087999999999

6.2788688000000015

3.066701700000003

cs

확실히 성능적인 측면에서 divmod가 상당히 좋은 점을 알 수 있습니다. 그럼 이제는 위에서 다루었던 부분을 바탕으로 리스트에서 홀수 및 짝수 항목을 출력해보도록 하겠습니다. 

먼저 간단한 리스트의 연산을 출력해보고자 합니다. 

위와 같은 리스트를 바탕으로 출력을 하고자 합니다. 그럼 우선 앞선 포스팅에서 인덱스 값을 출력하는 방법을 토대로, enumerate를 활용하겠습니다. 

example)

for index, value in enumerate(List):

print(str(index)+"번째 아이템 :" +value)

cs

result) 

0번째 아이템 :item1

1번째 아이템 :item2

2번째 아이템 :item3

3번째 아이템 :item4

4번째 아이템 :item5

cs

그럼 여기에서 위에서 썻던 항목인 divmod를 이용해서 2로 나누고 나머지가 0인 경우만 출력을하겠습니다. 

example) 

for index, value in enumerate(List):

result = divmod(index, 2)

if result[1== 0:

print(str(index)+"번째 아이템 :" +value)

cs

result) 

그럼 다음과 같은 결과가 나옵니다. 

번째 아이템 :item1

2번째 아이템 :item3

4번째 아이템 :item5

cs

그렇지만 결과가 일정 부분 오류가 있습니다. 코드상의 오류는 아니나, 실제 리스트의 인덱스 시작은 1부터 시작되기 때문에 위에서 index값에 1을 더해 줘야 합니다. 그래야지 조금 더 부드러운 결과가 나오지 않을까요 그럼 위와 같이 한번 바꿔 보겠습니다. 

example) 

for index, value in enumerate(List):

result = divmod(index+12)

if result[1== 0:

print(str(index+1)+"번째 아이템 :" +value)

cs

result) 

2번째 아이템 :item2

4번째 아이템 :item4

cs

이제 결과가 훨씬 부드러워 졌습니다. 

오늘은 divmod를 이용한 나눗셈, 몫, 나머지를 구하는 방법에 대해서 살펴봤습니다. 이를 토대로, 리스트등의 시퀀스한 데이터에서 짝수 또는 홀수번째 데이터를 추출하는 방법도 함께 알아봤습니다. (물론 조금 보시는 분이 응용하셔야 합니다. ) 생각보다 간단하면서 나름 유용하게 사용할 수 있는 내용입니다. 

혹시 궁금하시거나 문의사항이 있으시면 언제든지 댓글 및 방명록에 글남겨주시길 바랍니다. 감사합니다.