상세 컨텐츠

본문 제목

원하는 개수만큼 리스트에서 잘라 출력하기

Python

by techbard 2015. 7. 6. 10:40

본문

반응형

누군가에게 파이썬을 가르치고 있는데 진행하던 중에 내었던 문제에 대한 문제 풀이를 시도해 보겠다.


< 구현스펙 >


  1. 리스트는 문자열을 담고 있다.
  2. 정해진 숫자의 리스트 요소로 잘라서 각각 출력한다.


지금부터 나의 구현을 설명한다.


colors = ['red', 'yellow', 'black', 'brown', 'white', 'purple']


먼저 파이썬의 대표적인 특징인 리스트에 대해서 살펴보자.


print(type(colors))


(결과)

<type 'list'>


- 데이터 유형은 리스트 타입임을 알 수 있다.


이 리스트 전체를 집합으로 볼 때 이 집합의 개별 요소를 사용하기 위해서는 다음의 방법을 쓸 수 있다.


<리스트 요소에 접근하는 방법 1>


for color in colors:

print(color)


(결과)
red
yellow
black
brown
white
purple


<리스트 요소에 접근하는 방법 2>


startPos = 0

colorLength = colors.__len__()


for i in range(startPos, colorLength):

print(colors[i:i+1])


(결과)

['red']

['yellow']

['black']

['brown']

['white']

['purple']


colorLength = colors.__len__()

: .__len__()는 리스트 객체의 메쏘드로 객체의 원소 개수를 리턴한다. 즉, colorLength 에는 6이 들어가며 이는 colors 리스트의 원소 개수가 6개임을 의미한다.


- for i in range()

: for문 에서 쓰는 range() 함수는 정의한 조건의 숫자 리스트를 생성한다. 따라서, range(0, 6)은 [0, 1, 2, 3, 4, 5]의 range 객체가 생성된다. 이어서 for 문의 in 뒤에 놓임으로써 for문에 의해 다음의 결과가 나온다.


for i in range(0, 6):

print(i)


(결과)

0

1

2

3

4

5


colors[i:i+1]

: 이제 리스트 슬라이스에 대해서 알아볼 차례이다. 리스트에서 원하는 요소를 추출해내는 표기법을 말하는데 대표적인 사용법은 다음과 같다. (타이핑 하면서 그 결과를 반드시 확인해 보기 바란다.)


  • 리스트 내의 모든 요소를 의미할 때

print ( listVariable[:] )


  • 요소중 첫번째 요소만 의미할 때

print(colors[0:1])


  • 요소중 마지막 요소만 의미할 때

print(colors[-1:])


  • 요소중 마지막 바로 전 요소만 의미할때

print(colors[-2:-1])


  • 요소중 마지막 요소와 바로 전 요소 모두를 의미할때

print(colors[-2:])


  • 요소중 첫번째 요소와 두 번째 요소 모두를 의미할때

print(colors[0:2])


: 즉, colors[i:i+1]는 index로 쓰인 i 변수 위치에 해당하는 요소 하나를 꺼내는 것이다.


- 여기서 <리스트 요소에 접근하는 방법 1> / <리스트 요소에 접근하는 방법 2>의 결과를 주목해서 보자.

생긴 모양이 다른데 방법 1 에서는 스트링이 출력되고 있으며, 방법 2 에서는 개별 리스트의 형태를 가지고 있다.



- 알고리즘 고민

이제는 알고리즘에 대해서 고민해 보자.


구현 스펙중 하나는 정수 개수만큼 요소를 끊어서 출력하라는 것이다.


이 정수 개수를 정의해 보자.


separator 이던 divider 이던 상관없다. 의미만 통하면 되나까.


divider = 3

# 리스트의 요소를 세 개씩 끊어 출력한다. 이 변수는 요소 3개씩 끊어 출력함을 의미한다.


  1. 맨 처음에는 리스트 요소 인덱스 0 에서 3까지 출력하면 요소 3개가 될 것이다. 확인해 보자.
    1. print(colors[0:3])
    2. (결과)
    3. ['red', 'yellow', 'black']
  2. 그럼 두 번째 출력 내용은 어떻게 나타낼 수 있나? [0:3]까지로 3개 요소를 꺼냈으니 [4:6] 인가? 아니다.
    1. print(colors[3:6])
    2. (결과)
    3. ['brown', 'white', 'purple']
  3. 즉, 리스트 슬라이스 해서 꺼낸 결과를 출력하면 되는데 슬라이스를 하는 숫자만 원하는 숫자로 만들어 내면 된다. 다음과 같이 표현 가능하다.
  4. 숫자 요소로 표현
    1. colors[0:3] -> colors[3:6]
  5. 변수로 표현
    1. colors[startPos : i]
  6. for ~ range 함수와 변수로 표현한 리스트 슬라이스의 결합
    1. 위에서 배운 문법을 이용해서 원하는 결과 (첫번째 회돌이에서는 0:3 두번째 회돌이에서는 3:6 이 나오려면)


for i in range(startPos, endPos+divider, divider):

colors[startPos : i]


따라서, 다음의 코드로 표현이 가능하다.


colors = ['red', 'yellow', 'black', 'brown', 'white', 'purple']


start_pos = 0

end_pos = len(colors)


div = 3


for idx in range(start_pos, end_pos + div, div):

out = colors[start_pos:start_pos + div]

if out != []:

print(out)

start_pos = start_pos + div


# 결과

['red', 'yellow', 'black']

['brown', 'white', 'purple']


원하는 요소 개수로 끊어서 출력하기 위해서 슬라이스 표기법의 숫자를 원하는 대로 생성하는 방법을 사용했다. 회돌이하면서 [] 리스트가 출력될 수 있으므로 비어 있을 때는 출력하지 않는다.


divider = 3 의 결과


['red', 'yellow', 'black']

['brown', 'white', 'purple']


divider = 5 의 결과


['red', 'yellow', 'black', 'brown', 'white']

['purple']


divider = 7 의 결과


['red', 'yellow', 'black', 'brown', 'white', 'purple']


또 다른 구현 방법은 다음과 같다. 리스트 슬라이스는 이용하지 않고 배열의 개수만 가지고 로직을 만들어 보았다.




확실히 슬라이스의 특성을 이용하지 않으면 로직이 복잡해 지고 실수의 여지가 많지만 if ~ then의 논리력을 연습하기에는 좋은 것 같다.

반응형

관련글 더보기

댓글 영역