티스토리 뷰

파이썬은 타입의 분류로 sequence(순차형)을 정의한다. 앞에서 살펴본 range()와 스트링, 그리고 여기서 볼 리스트가 대표적인 시퀀스 타입이다. 요소 타입의 데이터가 순차적으로 다루어질 수 있는 타입을 시퀀스라고 한다.

리스트(list)의 리터럴 표현은 대괄호로 둘러싸인 값의 연속이다. 특징이라면 리스트의 요소들은 서로 다른 타입이 될 수 있다.

>>> [1, 2, 3]
[1, 2, 3]
>>> x = [a, 1, '123']
>>> y = [x, [1, 2, 3]]  # 리스트를 원소로 가지는 리스트

리스트는 스트링과 같은 시퀀스 타입이어서 차례로 방문하거나 요소에 대해 적용되는 많은 기능을 동일하게 사용한다. 특히 인덱싱하는 방법과 슬라이스, for in을 쓰는 방법은 스트링과 동일하다.

>>> xlist = [1, 2, 3, 4, 5]
 >>> print(xlist[0], xlist[-1], xlist[2:4])
1 5 [3, 4]
>>> xlist[1::2]
[2, 4]

요소를 차례로 방문하는 for in은 리스트에 대해서 가장 많이 쓰이는 코드 중 하나다. 그런데 파이선에서는 다음과 같은 코드는 금기시되어 있다. 파이썬 언어의 장점을 살리지 못하고 파이썬스럽지 않은 코드다.

for i in range(5):
    print(xlist[i], end=' ')
print()
파이썬의 리스트에 대해 for 루프를 돌리고 싶다면 반드시 for x in list:을 사용해야 한다. 인덱스가 반드시 필요한 몇몇 경우를 제외한다면 for i in range(...) 코드는 써서는 안 된다. 또한 배열의 요소를 xlist[i]와 같이 인덱스로 접근하는 일도 거의 없어야 한다. 이것은 파이썬을 처음 접하는 사람들이 주의해야 되는 것 중 하나다. 다행히 요즘은 자바에서도 콜렉션을 많이 쓰면서 for : 형태의 루프가 도입되어 익숙해졌을 것이다.
for  x in xlist:
   print(x, end=' ')
print()

또한 len(), min(), max(), sum() 같은 함수의 사용도 동일하다. 단, 스트링은 문자 데이터의 연속인데 리스트는 서로 다른 데이터가 들어있을 수 있으므로 서로 비교 가능하지 않은 요소가 있으면 max() 함수는 오류가 난다. 또한 숫자가 아닌 요소가 있으면 sum() 함수도 오류를 일으킬 것이다.

다음으로 리스트의 메소드를 생각해 보자. 매개변수의 위치를 찾아 인덱스를 돌려주는 index(), 매개변수가 리스트에 몇번 나오는지 돌려주는 count() 등의 조회 메소드가 있다. 스트링과 달리 리스트는 언제든 자체의 요소를 추가, 삭제, 변경할 수 있는 타입이다. 그런 점에서 리스트에 추가, 삭제할 수 있는 많은 메소드들이 제공된다. 리스트에 추가하는 메소드들이 다음의 세 가지 있다.

  • append() - 매개변수를 리스트 끝에 덧붙인다
  • extend() - 리스트를 매개변수로 받아 그 요소들을 리스트 뒤에 덧붙인다.
  • insert() - 매개변수로 온 요소를 지정된 인덱스에 삽입한다.

append와 insert는 리스트가 매개변수로 왔을 때 그것을 하나의 요소로 끝에 붙이고 extend는 리스트를 풀어서 그 요소들을 차례로 원래의 리스트에 덧붙인다. 요소를 제거하는 메소드로는 다음과 같은 세 가지가 있다.

  • remove() - 해당 요소를 리스트에서 제거
  • pop() - 주어진 인덱스의 요소를 제거 (그 요소를 리턴한다)
  • clear() - 리스트의 모든 요소를 제거

remove는 요소를 매개변수로 받고 pop은 인덱스를 매개변수로 받는다. pop은 그 인덱스에 있던 삭제된 요소를 반환값으로 돌려준다.

한편 리스트의 요소를 찾아주는 다음과 같은 두 메소드가 있다.

  • index() - 매개변수의 위치를 찾아 인덱스를 돌려준다
  • count() - 매개변수가 리스트에 몇번 나오는지 돌려준다
리스트의 요소의 순서를 정렬하거나 뒤집는 메소드로 다음의 두 가지가 있다. 주의할 점은 이들 메소드는 호출된 객체의 값을 그 자리에서(in place) 바꾸어 버린다는 것이다. 그러므로 원래 순서를 알고 있어야 한다면 그것을 미리 복사하여 저장해 두어야 한다.
  • sort() - Sort items in a list in ascending order
  • reverse() - Reverse the order of items in the list
alist = [1, 2, 3, 4, 5]
blist = alist
alist.reverse()
print(blist)
리스트를 복사하여 저장하기 위해 위와 같이 지정문을 쓰면 그것은 참조만 복사한다. 같은 리스트를 가리키고 있으므로 alist를 뒤집은 후에 blist를 출력하면 [5, 4, 3, 2, 1]이 출력된다. blist가 alist의 복사를 가지고 있게 하려면 blist = alist.copy()를 써야 한다. 그러면 새로운 리스트를 만들고 요소를 복사한다. 여기서 얕은 복사란 각 요소가 또 다른 리스트나 객체를 가리킨다면 그 참조만 복사한다는 의미다.

  • copy() - 리스트의 얕은 복사를 반환한다.



'파이썬 프로그래밍' 카테고리의 다른 글

파이썬 함수  (0) 2019.02.18
파이썬 리스트 컴프리헨션  (0) 2019.01.28
파이썬 스트링  (0) 2019.01.27
파이썬 시작하기 (5) - 문장 if와 for  (1) 2019.01.25
파이썬 시작하기 (4) - 연산과 수식  (0) 2019.01.25
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
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 31
글 보관함