리스트(list)

애늙은이·2023년 7월 25일
0
post-thumbnail

첫 번째로 살펴볼 컨테이너 자료형은 리스트입니다. 리스트는 컨테이너 자료형에서 살펴봤던 세 가지 특징을 모두 가지고 있기에 코드를 짤 때 자주 사용됩니다.

💡 리스트란?

리스트는 컨테이너 중 하나로 자료들의 순서가 있고, 중복을 허용한다는 특징을 지니고 있습니다. 다음과 같이 표현할 수 있습니다.

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]
  • start: 슬라이싱을 시작하는 위치입니다. 값이 없으면 처음 원소부터입니다.
  • end: 슬라이싱을 끝내는 위치입니다. end에 해당하는 원소는 슬라이싱에 포함되지 않습니다. 값이 없으면 마지막 원소까지 슬라이싱됩니다.
  • step: 해당하는 수만큼 이동하면서 슬라이싱을 합니다. 기본값은 1입니다.

다음 코드를 통해서 확인해보도록 하겠습니다.

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 위치에 삽입함
profile
글쓰는 개발자입니다.

0개의 댓글