카테고리 없음

Python 컨테이너 - List

jin_j_i_n 2022. 10. 23. 23:24

파이썬에서는 다른 객체들을 여러개 담을 수 있는 자료형을 제공한다.

  • List (리스트)
  • Tuple (튜플) 
  • Set (집합)
  • Dict (사전)

 

1. List

파이썬에서 가장 유연하게 사용할 수 있고, 많이 사용되는 컨테이너이다.

대괄호 ( [] )로 만들어지며, 컴마 기호를 사용해서 아이템을 구분한다.

 

list = [1, 2, 3, 4, 5]
list2 = [1, 3, "string", 1.34] # 한개의 리스트 안에 여러 타입을 넣을 수도 있다

 

1.1 리스트 인덱싱과 슬라이싱

리스트도 문자열 처럼 인덱싱과 슬라이싱이 가능하다.

 

- 리스트 인덱싱

 

문자열에서의 인덱싱과 마찬가지로 인덱스가 마이너스 값이면 뒤에서부터 요소값을 의미한다.

만약 인덱스가 -1 이면 뒤에서부터 첫번쨰 값을 의미한다.

 

list = [1, 3, "string", 1.34]
print(list[0]) # 1
print(list[2]) # string 
print(list[-1]) # 1.34

 

- 리스트 슬라이싱

 

문자열에서의 슬라이싱과 마찬가지로 대괄호와 : 기호로 이루어지며 

왼쪽 숫자는 포함, 오른쪽숫자는 포함하지 않는다.

list[0:2] 는 0번째 요소부터 포함하여 2번째 요소 전까지를 의미한다 ( 0번째, 1번째 )

 

리스트에서의 슬라이싱 규칙은 문자열에서 슬라이싱 규칙과 동일하다.

 

list = [1, 2, 3, 4, 5]

print(list[0:2]) # [1, 2]
print(list[:3]) # [1, 2, 3]
print(list[:]) # [1, 2, 3, 4, 5]
print(list[2:]) # [3, 4, 5]

 

1.2 리스트 연산하기 

 

- 리스트 더하기

 

a = [1, 2, 3]
b = [4, 5, 6]
c = a + b

print(c) # [1, 2, 3, 4, 5, 6]

 

- 리스트 반복하기

 

a = [1, 2, 3]
c = a * 3

print(c) # [1, 2, 3, 1, 2, 3, 1, 2, 3]

 

- 리스트 길이 구하기

 

a = [1, 2, 3]

print(len(a)) # 3

 

1.3 리스트는 가변 (mutable) 자료형

리스트는 문자열과 달리 가변 자료형이다.

 

a = [1, 2, 3]
print(f"list a's id is {id(a)}") # list a's id is 4378037120

a[0] = 100
print(a) # [100, 2, 3]
print(f"list a's id is {id(a)}") # list a's id is 4378037120

 

리스트는 슬라이싱으로도 대입이 가능하다.

 

my_list = [0, 1, 2, 3, 4, 5]

print(id(my_list)) # 4299885440

my_list[1:3] = ["A", "B", "C"]

print(id(my_list)) # 4299885440
print(my_list) # [0, 'A', 'B', 'C', 3, 4, 5]

위 슬라이싱 연산은 [1:2] 범위에 ["A", "B", "C"] 를 대입한다는 의미가 된다.

 

파이썬에서 가변 컨테이너에 가변 객체를 넣을때는 주의해야하는데, 이유는 아래와 같다.

 

my_list = ["Hello", 1, 2, 3]
new_list = my_list.copy() # 동일하지만 새로운 리스트 객체를 만들어 준다.

print(id(my_list)) # 4370434944
print(id(new_list)) # 4370454336

print(id(my_list[0])) # 4370725168
print(id(new_list[0])) # 4370725168

 

copy() 함수를 통해 새로운 객체를 만들어 냈지만, 원소 자체는 같은 객체를 공유한다.

파이썬에서는 동일한 문자열 혹은 동일한 숫자형에 대해서는 재활용을 하도록 한다.

 

이러한 성질은 리스트 안에 리스트가 들어간다면 의도치 않은 결과를 불러일으킬 수 있다.

 

my_list = [["Hello"], 1, 2, 3]
new_list = my_list.copy()

print(id(my_list)) # 4308588352
print(id(new_list)) # 4308859520

print(id(my_list[0])) # 4308568960
print(id(new_list[0])) # 4308568960 

new_list[0][0] = "NewHello"

print(my_list) # [['NewHello'], 1, 2, 3]
print(new_list) # [['NewHello'], 1, 2, 3]

 

 

1.4 리스트관련 함수

 

- append

 

my_list = [0, 1, 2, 3, 4, 5]

print(id(my_list)) # 4313073728 

my_list.append(6) 

print(id(my_list)) # 4313073728

 

여기서 append는 새로운 객체를 만들어내지 않는다.

append 메소드 def를 보면,

 

 

None 을 리턴한다. 파이썬에서 None은 아무것도 아니라는것을 의미하는 타입이다.

 

- pop(index)

원하는 위치에서 아이템을 가져올 수 있고, 리스트에서 해당 요소는 삭제된다.

index를 넣지않으면 리스트의 마지막 요소를 가져온다.

 

my_list = [0, 1, 2, 3, 4, 5]

print(my_list.pop()) # 5
print(my_list.pop(2)) # 2 
print(my_list) # [0, 1, 3, 4]

 

- reverse

리스트 요소들의 순서를 뒤집는다.

append와 마찬가지로 새로운 객체를 만들어내지 않는다. reverse 메서드 또한 None을 리턴한다.

 

my_list = [0, 1, 2, 3, 4, 5]
my_list.reverse()
newList = my_list[:] 
# 또는 my_list[::-1] 로도 새로운 리스트객체 생성 가능
# copy() 함수를 사용해 새로운 객체를 만들어낼 수 있다.


print(id(my_list)) # 4298490048
print(id(newList)) # 4298575040

print(my_list) # [5, 4, 3, 2, 1, 0]
print(newList) # [5, 4, 3, 2, 1, 0]

 

- sort

리스트의 요소를 순서대로 정렬해준다.

 

my_list = [2, 1, 7, 6, 0, 5]
my_list.sort()

print(my_list) # [0, 1, 2, 5, 6, 7]

 

- index(x)

리스트에 x가 있다면 x가 위치한 인덱스 값을 리턴한다.

 

my_list = [1, 2, 3, 4, 5, 6]

print(my_list.index(5)) # 4

 

- insert(a, b)

a 위치에 b를 삽입하는 함수이다.

 

my_list = [1, 2, 3, 4, 5, 6]
my_list.insert(0, 7)
my_list.insert(-1, 7)

print(my_list) # [7, 1, 2, 3, 4, 5, 7, 6]

 

 - remove(x)

리스트에서 첫번재로 나오는 x를 삭제하는 함수이다.

 

my_list = [1, 2, 3, 4, 5, 6, 4]
my_list.remove(4)

print(my_list) # [1, 2, 3, 5, 6, 4]

 

- count(x)

리스트 안에 x가 몇개 있는지 조사하여 그 개수를 리턴한다.

 

my_list = [1, 2, 3, 4, 5, 6, 4]
cnt = my_list.count(4)

print(cnt) # 2

 

- extend(list)

원래 리스트에 인자로 들어온 리스트를 더하게 된다

 

my_list = [1, 2, 3]
list = [4, 5, 6]

my_list.extend(list)

print(my_list) # [1, 2, 3, 4, 5, 6]

 

mylist.extend(list) 는 my_list += list 와 동일하다.