본문 바로가기

Python

[Python] 2. 파이썬의 기본 자료형(3) - 리스트(List) & 튜플(Tuple)

반응형

 

파이썬의 리스트는 전반적으로 문자열(String)과 유사한 부분이 많다. 

겹치는 부분은 비교적 간단하게 설명하므로 문자열(String) 게시글(rebro.kr/123)과 비교해서 본다면 도움이 될 것 같다.

 

 

[목차]

 

1. 리스트 생성, 연산자

 

2. 리스트의 인덱싱과 슬라이싱

 

3. 리스트의 수정, 변경, 삭제

 

4. 리스트 관련 함수

 

5. 튜플 (Tuple)

 

 

 

  1. 리스트 생성, 연산자

 

파이썬에서 리스트를 생성하는 방법은 대괄호 '[ ]' 로 감싸주고, 리스트의 원소들은 쉼표 ','로 구분해준다.

리스트는 아무 원소를 포함하지 않는 빈 리스트일 수도 있고, 숫자를 원소로 가질 수도 있고 문자열을 원소로 가질 수도 있다. 즉, 어떠한 자료형도 원소로 가능하다. 

a = [] # 빈 리스트

a = [1,2,3,4] # 숫자 원소

a = ['python', 'c++', 'java'] # 문자열 원소

a = ['python', 1, 5] # 문자열과 숫자가 섞여도 됨

a = [1, 2, [1, 2]] # 리스트를 원소로 가질 수 있음

a = [[100, 10], [4, 6]]

 

리스트에서도 덧셈 연산자 +와 곱셈 연산자 *를 사용할 수 있다. 

두 리스트를 더하는 것은 두 리스트를 합치는 기능을 하고, 리스트에 숫자를 곱하게 되면 리스트가 해당 숫자만큼 반복되어 새로운 리스트를 생성한다.

문자열과 작동 방식이 동일하며, 아래의 예시들처럼 이용 가능하다.

 

a = [1, 2]
b = [3, 4, 5]

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

e = a*3         # e = [1, 2, 1, 2, 1, 2]
f = a*2 + b*3   # f = [1, 2, 1, 2, 3, 4, 5, 3, 4, 5, 3, 4, 5]

 

 

  2. 리스트의 인덱싱과 슬라이싱

 

리스트도 문자열과 동일한 방식으로 인덱싱과 슬라이싱이 가능하다. 

마찬가지로 인덱스의 시작은 0이며, 음수인 경우에는 뒤에서 몇 번째인지를 나타낸다. 

 

리스트는 문자열이나 리스트를 자신의 원소로 가질 수 있기 때문에 해당 원소 내의 원소도 접근이 가능하다. 

 

a = [1, 2, [3, 4], 'python']

print(a[0])     # ans : 1

print(a[-1])    # ans : 'python'

print(a[2])     # ans : [3, 4]

print(a[2][0])  # ans : 3

print(a[3][2])  # ans : 't'

 

리스트 안에 숫자, 문자열, 리스트가 원소로 존재하는 경우이다. 

인덱스나 슬라이싱에 대한 자세한 설명은 위에서 언급한 문자열 게시글을 참고하면 된다. 

 

리스트 내에 리스트가 원소로 있는 중첩 리스트의 경우는 C/C++를 배운 사람이라면 '이차원 배열'을 생각하면 쉽다. 

a[2]가 리스트이므로 a[2]안의 원소에 접근하기 위해서는 동일한 방식으로 인덱스를 붙여주면 된다. 

만약 안에 또 리스트가 있다면 a[2][0][1], ... 이렇게 이용해주면 된다. 

 

리스트에서 슬라이싱을 이용하면 포함된 원소로 구성된 리스트를 반환해준다.

a = [1, 2, 3, 4, 5]로 주어지면 a[0:2] = [1, 2], a[1:] = [2, 3, 4, 5], a[:3] = [1, 2, 3] 이렇게 문자열과 같은 방식으로 작동하고, 중첩 리스트인 경우에도 인덱싱과 동일하다. 

크게 어렵지 않으니 예시를 통해 쉽게 이해할 수 있다.

 

a = [1, 2, [3, 4, 5], 'python']

print(a[:2]) # ans : [1, 2]

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

print(a[2:]) # ans : [[3, 4, 5], 'python']

print(a[2][1:]) # ans : [4, 5]

print(a[3][:3]) # ans : 'pyt'

 

 

  3. 리스트의 수정, 변경, 삭제

 

파이썬의 문자열은 immutable 한 성질을 가졌기 때문에 특정 문자를 다른 문자로 직접 바꿀 수는 없었지만, 리스트는 원소를 다른 원소로 바꾸거나 삭제할 수 있다. 

 

1. 리스트에서 원소 하나 수정하기

 

a = [1, 2, 3]

a[2] = -1

print(a) # ans : [1, 2, -1]

 

2. 리스트에서 연속된 범위의 값 수정하기

 

a = [1, 2, 3]

a[1:2] = ['a', 'b', 'c']

print(a) # ans : [1, 'a', 'b', 'c', 3]

a[2:4] = [10]

print(a) # ans : [1, 'a', 10, 3]

 

리스트는 연속된 범위의 원소를 한 번에 수정할 수 있다. 

바꾸고 싶은 범위를 슬라이싱 하듯이 [a:b]로 지정해주고, 바꾸고 싶은 원소로 이루어진 리스트를 할당하면 [a:b] 범위가 할당하는 리스트로 바뀌게 된다. 

 

여기서, a[1:2] = ['a', 'b', 'c']와 a[1] = ['a', 'b', 'c']은 완전히 다른 결과를 이끌어낸다는 점을 주의하자. 

수정되는 원소는 a[1]로 동일하지만, a[1:2]는 a[1]의 자리에 'a', 'b', 'c'의 원소를 대신 넣어주는 것이고, a[1]은 두번째 원소를 리스트 ['a', 'b', 'c']로 교체해주는 것이다. 

만약 a[1] = ['a', 'b', 'c']를 수행한다면 a = [1, ['a', 'b', 'c'], 3]으로 나오게 된다. 

 

3. 리스트에서 원소 삭제하기

 

연속된 범위의 값을 수정할 때 빈 리스트를 할당해주면 해당 범위의 원소를 삭제한 것과 동일한 결과로 나온다. 

 

a = [1, 2, 3]

a[1:2] = []

print(a) # ans : [1, 3]

 

또 del 이라는 리스트 요소를 삭제하는 함수를 이용해서 원소를 제거할 수도 있다.

다음과 같이 이용한다.

 

a = [1, 2, 3]

del a[1]

print(a) # ans : [1, 3]

a = [1, 2, 3, 4]

del a[1:3]

print(a) # ans : [1, 4]

 

del 뒤에 지우고 싶은 원소 혹은 범위를 적어주면 입력된 값이 리스트에서 제거된다. 

추가적으로 del은 리스트뿐만 아니라 다른 자료형에서도 이용 가능하다.

 

  4. 리스트 관련 함수

 

리스트 a가 기본으로 a = [1, 4, 2, 3]이라고 선언되어있다고 가정한다. 

 

함수 설명 예시 수행 결과
 append 리스트의 맨뒤에 원소를 추가 a.append(6) 

a.append([3, 4])
a = [1, 4, 2, 3, 6]

a = [1, 4, 2, 3, [3, 4]]
 extend 리스트의 맨뒤에 여러 원소를 추가 a.extend([3, 4]) a = [1, 4, 2, 3, 3, 4]
 sum 리스트의 원소의 합을 반환 sum(a) 10
 max/min 리스트의 원소중 최댓값/최솟값을 반환 max(a) / min(a) 4 / 1
 len 리스트의 원소 개수를 반환 len(a) 4
 sort 리스트의 원소를 오름차순으로 정렬

sort(reverse=True) : 내림차순
a.sort() 

a.sort(reverse=True)
a = [1, 2, 3, 4]

a = [4, 3, 2, 1]
 sorted 리스트의 원소를 오름차순으로 정렬한 리스트를 반환 a.sorted() [1, 2, 3, 4]
 reverse 리스트를 뒤집어줌 a.reverse()  a = [3, 2, 4, 1]
 index 리스트에 해당 원소가 존재하면 위치를 반환한다.

존재하지 않으면 오류를 발생시킨다.
a.index(4)

a.index(7)
1

ValueError : 7 is not in list
 insert 리스트의 i번째 위치에 b를 삽입 a.insert(2, 'k') a = [1, 4, 'k', 2, 3]
 remove 리스트에서 처음으로 나오는 해당 원소를 삭제 a.remove(2) a = [1, 4, 3]
 pop 원소를 삭제하고 삭제된 원소를 반환

아무원소도 넣지 않는 경우 맨 뒤의 원소 제거
a.pop()

a.pop(0)
a = [1, 4, 2]

a = [4, 2, 3]
 count 리스트에 포함된 원소 x의 개수 반환 a.count(3) 1
 clear 리스트의 모든 원소를 삭제 a.clear() a = [ ]

 

 

  5. 튜플 (Tuple)

 

튜플은 리스트와 비슷하지만 immutable하다는 큰 차이점이 있다.

따라서 튜플은 한번 생성하면 변경할 수 없기 때문에 보통 항상 일정한 값을 가지기를 원하는 경우에 사용한다. 

더불어 리스트에서 사용하는 많은 함수들을 당연히 튜플에서는 사용하지 못한다. 

min/max, len, sum등 원소를 조작하지 않는 함수들만 이용할 수 있다.

 

튜플을 생성하는 방법은 리스트에서 대괄호 '[ ]'를 이용했다면 튜플은 소괄호 '( )'를 이용한다.

원소가 1개인 경우에는 원소 뒤에 쉼표 ','를 넣어주어야 하고, 괄호를 쓰지 않고 a = 1, 2, 3 이런 식으로 선언하면 자동으로 튜플로 지정되는 특징이 있다. 

 

앞의 리스트에 대한 설명을 잘 이해했다면 튜플 또한 이해하는게 어렵지 않다. 예시 코드를 통해서 충분히 이해가 될 것이다. 

 

# 튜플 선언 방법
a = (1, 2, 3)
a = (1,)
a = 1, 2, 3 
a = ()
a = (1, 2, (1, 2))

a = (1, 2, 3, 4)

print(a[1])   # ans : 2
print(a[1:3]) # ans : (2, 3)

a[2] = 1    #Error : 'tuple' object does not support item assignment

del a[2]    #Error : 'tuple' object doesn't support item deletion

print(sum(a)) # ans : 10
print(min(a)) # ans : 1
print(max(a)) # ans : 4

b = (10, 7)

print(a+b) # ans : (1, 2, 3, 4, 10, 7)

print(b*2) # ans : (10, 7, 10, 7)

 

 

PC로 보시는 것을 권장합니다. 

피드백은 언제나 환영입니다. 댓글로 달아주세요 ^-^

반응형