첫 번째로 살펴볼 컨테이너 자료형은 리스트입니다. 리스트는 컨테이너 자료형에서 살펴봤던 세 가지 특징을 모두 가지고 있기에 코드를 짤 때 자주 사용됩니다.
리스트는 컨테이너 중 하나로 자료들의 순서가 있고, 중복을 허용한다는 특징을 지니고 있습니다. 다음과 같이 표현할 수 있습니다.
student_lst = ["철수", "영희", "미애", "훈이"]
리스트는 기본적으로 대괄호([]
)로 쉼표(,
)로 연결된 원소들을 감싸는 형태를 띠고 있습니다.
또한 앞서 말했듯, 여러 자료형의 데이터들이 원소로 올 수 있죠.
lst1 = [] # 비어있는 리스트, lst1 = list()로도 쓸 수 있습니다.
lst2 = [1, 2, 3, 4, 5]
lst3 = ["철수", 95, 70, 100]
lst4 = ["철수", 95, [70, 100]] # 리스트 또한 리스트의 요소가 될 수 있습니다
리스트의 데이터들에는 순서가 있습니다. 리스트 안에 첫 번째 요소, 두 번째 요소...와 같이 말이죠. 리스트의 인덱싱은 리스트의 순번에 따른 데이터를 꺼내는 것입니다.
인덱스는 해당하는 리스트에 대괄호([]
)와 인덱스 번호를 지정하여 접근합니다.
a = [5, 4, 3, 2, 1]
리스트 a에서 첫 번째 원소는 무엇일까요?
print(a[0]) # 결과: 5
위처럼 인덱스는 1이 아닌 0부터 시작합니다. 따라서 리스트가 5개의 원소를 가지고 있다면 인덱스는 4까지 있는 것이죠.
print(a[5]) # 범위 밖의 인덱스 접근으로 오류가 발생한다
인덱스는 마지막 요소부터 접근하는 것도 가능합니다. 이때는 -1부터 시작합니다.
print(a[-1]) # 결과: 1
print(a[-3]) # 결과: 3
그렇다면 리스트 안에 리스트가 있는 형태에서 인덱스 접근은 어떻게 될까요?
a = [1, 2, 3, ["철수", "미애"]]
print(a[3][0]) # 결과: 철수
위와 같이 인덱싱을 두 번 사용함으로써 접근할 수 있습니다. a라는 리스트의 네 번째 원소인 ["철수", "미애"]
에 먼저 접근하고, 그 리스트의 첫 번째 원소에 접근한 결과이죠.
우리는 인덱싱을 통해서 리스트의 원소 하나를 꺼낼 수 있었습니다. 하지만 만약 하나가 아닌 리스트의 일부분을 꺼내고 싶을 때는 어떻게 할까요? 그럴 때는 슬라이싱을 사용하여 여러 원소를 리스트에서 추출합니다.
리스트 슬라이싱은 다음과 같은 형태를 가지고 있습니다.
리스트[start:end:step]
다음 코드를 통해서 확인해보도록 하겠습니다.
a = [5, 4, 3, 2, 1]
print(a[0:2]) # 결과: [5, 4]
print(a[::2] # 결과: [5, 3, 1]
a[0:2]
를 살펴보면 start가 0, end가 2, step이 기본값인 1로 되어 있기에, [5, 4]
가 출력되는 것을 알 수 있습니다. 또한 a[::2]
의 경우, 처음 원소부터 끝 원소까지 step 값인 2에 따라 2칸씩 이동하면서 값을 가져왔기에 [5, 3, 1]
이 출력되었습니다.
음수로도 슬라이싱을 할 수 있습니다. 이때는 인덱싱과 같게 끝 인덱스부터 시작합니다.
print(a[-3:-1]) # 결과: [3, 2]
print(a[-3:]) # 결과: [3, 2, 1]
print(a[-1:-3]) # 결과: []
위와 같이 음수로 슬라이싱을 할 때, end값이 -1이 되면 끝 인덱스 전까지만 슬라이싱이 됩니다. 또한 슬라이싱의 범위가 [-1:-3]
처럼 start에 해당하는 원소가 end에 해당하는 원소보다 뒤에 있을 경우에는 해당하는 원소가 없으므로 빈 리스트를 출력하게 됩니다.
리스트는 2-3강에서 배웠던 연산자를 활용하여 계산이 가능합니다.
더하기 연산자는 두 개의 리스트를 합치게 할 수 있습니다.
x = ['a', 'b', 'c']
y = ['d', 'e', 'f']
print(x + y) # 결과: ['a', 'b', 'c', 'd', 'e', 'f']
곱하기 연산자는 지정된 횟수만큼 반복된 리스트를 새로 만듭니다.
x = ['a', 'b', 'c']
print(x * 4)
# 결과: ['a', 'b', 'c', 'a', 'b', 'c', 'a', 'b', 'c', 'a', 'b', 'c']
위의 코드를 보면, 피연산자가 되는 리스트가 반복된 새로운 리스트가 결과로 출력되는 것을 알 수 있습니다.
리스트는 수정이 가능합니다.
a = [1, 2, 3]
a[0] = 0
print(a) # 결과: [0, 2, 3]
위의 코드를 보면, 인덱싱을 통해서 값을 수정할 수 있습니다.
또한 del과 인덱싱을 통해서 리스트의 요소를 삭제할 수 있습니다.
a = [4, 5, 6]
del a[0] # del(a[0])도 가능합니다.
print(a) # 결과: [5, 6]
del a[0]
를 통해 인덱스에 해당하는 원소를 리스트에서 삭제했습니다. 이러한 수정은 인덱싱뿐만 아닌 슬라이싱으로도 가능합니다.
a = [7, 8, 9, 10]
a[0:2] = [1, 2]
print(a) # 결과: [1, 2, 9, 10]
del a[0:2]
print(a) # 결과: [9, 10]
리스트에 관한 수정은 리스트 관련 함수를 통해서도 가능합니다.
함수(function)란 특정 작업을 수행하는데 사용되는 코드 블럭입니다. 출력을 위해 사용했던 print()
나 타입을 확인하기 위해 사용했던 type()
, 앞서 배운 del
도 모두 함수에 해당합니다. 이들은 소괄호(()
)로 호출된다는 특징을 가지고 있습니다. 자세한 내용은 추후 함수에 관해 다룰 때 설명하겠습니다.
리스트에서는 리스트 뒤에 .
을 붙여 리스트와 관련된 함수들을 사용할 수 있습니다.
함수 | 기능 |
---|---|
append(elem) | elem을 리스트 맨 뒤에 새로운 원소로 추가함 |
remove(elem) | elem을 리스트에서 제거함(중복 시 가장 처음 것을 제거) |
pop() | 리스트 가장 마지막 원소를 추출함 |
sort(reverse=False) | 리스트의 원소를 정렬함(기본값은 False, True면 내림차순, False면 오름차순) |
sorted() | 오름차순으로 정렬한 새로운 리스트를 반환 |
reverse() | 리스트를 역순으로 뒤집음 |
index(elem) | elem이 리스트에 있으면 인덱스를 반환 |
insert(i, elem) | elem을 리스트 인덱스 i 위치에 삽입함 |