본문 바로가기
필기 노트/Python 기초

[Python 기초] 기본 자료형 : 리스트 (list)

by misconstructed 2020. 6. 24.
728x90

이번에는 파이썬의 기본 자료형 중, 리스트(list)에 대해 알아보겠습니다. 

리스트 (List)

리스트(list)는 다양한 요소를 모아서 저장할 수 있는 자료구조입니다. 리스트 안에는 어떠한 자료형도 삽입할 수 있습니다.

리스트명 = [요소1, 요소2, 요소3, ...] 의 형태로 생성할 수 있습니다.

빈 리스트는 l = list() 형태로 선언할 수 있습니다.

>>> l1 = [100, 'hello', [1, 2, 3]]
>>> l2  = []
>>> l3 = list()

리스트 연산

1. 리스트 인덱싱

문자열 인덱싱과 동일한 방법으로 수행됩니다.

리스트의 각 요소를 인덱스를 이용해서 접근할 수 있습니다. 이때, 각 인덱스는 0에서부터 시작합니다.

리스트의 뒤에서부터 접근하기 위해서는 - 를 이용해서 접근할 수 있습니다. -1의 경우 가장 마지막 요소를 접근하게 됩니다.

인덱스를 -0으로 접근하는 경우, 0번째 인덱스와 동일한 결과를 반환합니다.

>>> l = [1, 2, 3, 'a', 'b', 'c']
>>> l[0]
# 1
>>> l[-1]
# 'c'
>>> l[-0]
# 1

2. 리스트 슬라이싱

문자열 슬라이싱과 동일한 방법으로 사용할 수 있습니다.

리스트명[시작 인덱스 : 끝 인덱스] 와 같이 표현합니다. 전체 리스트의 일부를 잘라낸다고 생각하시면 됩니다.

문자열과 동일하게 주의하셔야 할 점은 끝 인덱스의 값을 결과에 포함되지 않는다는 점입니다.

>>> l = [1, 2, 3, 'a', 'b', 'c']
>>> l1 = l[1:3]
# [2, 3]
>>> l2 = l[:3]
# [1, 2, 3]
>>> l3 = l[3:]
# ['a', 'b', 'c']

3. 기타 리스트 연산

파이썬에서는 리스트에 대한 다양한 연산과 함수를 제공합니다. 대표적인 연산과 함수 몇 가지를 설명해보겠습니다.

  1. + : 리스트 더하기
  2. * : 리스트 내용을 반복하기
  3. len() : 리스트의 길이 구하기
  4. 리스트명[인덱스] = 새 값 : 리스트의 값 수정하기
  5. del 리스트명[인덱스] : 리스트의 특정한 값 혹은 특정한 범위의 값 삭제하기
  6. append() : 리스트의 마지막에 추가하기
  7. sort() : 정렬하기
  8. reverse() : 현재 리스트를 거꾸로 뒤집기 (정렬과는 무관한 연산입니다. 처음 리스트 요소를 그대로 뒤집습니다.)
  9. index() : 찾는 값의 위치를 반환, 값이 없는 경우 오류(value error)
  10. insert() : 특정 위치에 값을 삽입
  11. remove() : 찾는 값 중 리스트의 제일 앞에 있는 값을 제거
  12. pop() : 마지막 요소를 반환하고, 리스트에서 해당 값을 제거
  13. count() : 요소의 개수 반환
  14. extend() : 리스트형을 매개변수로 받아서 리스트를 확장
>>> l1 = [1, 2, 3, 4, 1, 2]
>>> l2 = [5, 6, 7, 8]
>>> l3 = [10, 9, 11, 8]
>>> l1 + l2
# [1, 2, 3, 4, 1, 2, 5, 6, 7, 8]
>>> l2 * 3
# [5, 6, 7, 8, 5, 6, 7, 8, 5, 6, 7, 8]
>>> len(l1)
# 6
>>> l1[0] = 999
# [999, 1, 2, 3, 4, 1, 2]
>>> del l1[0:2]
# [2, 3, 4, 1, 2]
>>> l1.append(99)
# [2, 3, 4, 1, 2, 99]
>>> l3.sort()
# [8, 9, 10, 11]
>>> l1.reverse()
# [99, 2, 1, 4, 3, 2]
>>> l1.index(1)
# 2
>>> l1.insert(2, 777)
# [99, 2, 777, 1, 4, 3, 2]
>>> l1.remove(2)
# [99, 777, 1, 4, 3, 2]
>>> l1.pop()
# 2
>>> print(l1)
# [99, 777, 1, 4, 3]
>>> l1.count(4)
# 1
>>> l1.extend(l2)
# [99, 777, 1, 4, 3, 5, 6, 7, 8]

리스트의 복사

리스트를 복사하는 방법은 총 3가지가 있습니다.

첫 번째 방법으로는, = 연산자를 사용해서 복사하는 방법입니다.

b = a라고 선언하는 경우, a가 가리키는 리스트를 b가 그대로 가리키게 됩니다.

그러므로, a를 통해서 리스트를 수정하면, b로 접근하는 경우 변경된 내용을 그대로 접근이 가능합니다.

 

※ id() 함수
id() 함수는 매개변수로 넘어오는 변수의 메모리 주소를 확인하게 됩니다.
그러므로, 위와 같이 b=a로 리스트를 복사하는 경우 동일한 객체를 접근하기 때문에, 
id(a) 값과 id(b) 값은 동일하게 됩니다.

 

>>> a = [1, 2, 3]
>>> b = a
>>> b
# [1, 2, 3]
>>> a[1] = 99
>>> a
# [1, 99, 3]
>>> b
# [1, 99, 3]
>>> id(a) == id(b)
# True

두 번째 방법은 슬라이싱 방법 중 리스트 전체를 의미하는 [:]를 사용하는 방법입니다.

b = a [:]로 선언하면 b 변수는 a 변수가 가리키는 리스트의 원소를 그대로 복사한 새로운 객체를 가리키게 됩니다.

그러므로, a를 통해서 리스트의 값을 변경해도 b 가 참조하는 리스트에는 영향을 주지 않습니다.

당연히 id(a)와 id(b)의 값은 서로 다르게 됩니다.

>>> a = [1, 2, 3]
>>> b = a[:]
>>> a[0] = 99
>>> a 
# [99, 2, 3]
>>> b 
# [1, 2, 3]
>>> id(a) == id(b)
# False

세 번째 방법은 copy 모듈을 사용하는 방법입니다.

우선, import 문을 사용해서 copy 모듈을 가져옵니다.

b = copy(a)라고 명시하면, b = a[:]와 동일하게 원소는 동일하지만 새로운 객체를 생성해서 b 변수로 접근하게 됩니다.

>>> import copy from copy
>>> a = [1, 2, 3]
>>> b = copy(a)
>>> a[2] = 99
>>> a
# [1, 2, 99]
>>> b
# [1, 2, 3]
>>> id(a) == id(b)
# False

해당 게시물은 <점프 투 파이썬>을 읽고 제 나름대로 정리한 내용입니다!

더 구체적인 정보나, 추가적인 내용을 확인하고 싶으시면 <점프 투 파이썬>을 참고해주시기 바랍니다.

잘못된 부분 지적이나 피드백은 언제든지 환영입니다.

감사합니다 :)

 

 

 

728x90

댓글