Unit 22
리스트와 튜플
- 파이썬의 리스트는 요소를 추가하거나 삭제할 수 있고, 정보를 조회하는 메서드(함수)도 제공한다.
- 파이썬의 리스트가 for 반복문과 결합하면 연속적이고 반복되는 값을 손쉽게 처리할 수 있다.
1. 리스트 조작하기
1-1. 리스트에 추가, 확장하기
- 리스트의 대표적인 기능은 '요소 추가'인데, 리스트에 요소를 추가하는 메서드는 3가지가 있다.
- append : 요소 하나를 추가
- extend : 리스트를 연결하여 확장
- insert : 특정 인덱스에 요소 추가
- append(요소)는 리스트 끝에 요소 하나를 추가한다.(빈 리스트에 값을 추가하는 것도 가능)
- 이때 메서드를 호출한 리스트가 변경되며 새 리스트는 생성되지 않는다.>>> a = [10, 20, 30] >>> a.append(500) >>> a [10, 20, 30, 500] >>> len(a) 4
>>> a = [] >>> a.append(10) >>> a [10]
- append(리스트)를 이용하면 리스트 안에 리스트를 넣을 수 있다.
- [500, 600]이라는 요소 하나를 리스트 a 끝에 추가했기 때문에 a의 길이는 5가 아닌 4이다.>>> a = [10, 20, 30] >>> a.append([500, 600]) >>> a [10, 20, 30, [500, 600]] # 중첩 리스트가 됐음 >>> len(a) 4
※ 즉, append에서는 리스트의 길이가 항상 1씩 증가한다.
- 추가할 요소가 여러 개 라면, 리스트 끝에 다른 리스트를 연결하여 리스트를 확장하는 extend(리스트)를 사용한다.
>>> a = [10, 20, 30] >>> a.extend([500, 600]) >>> a [10, 20, 30, 500, 600] >>> len(a) 5
- extend를 사용하면 리스트의 길이는 extend에 전달된 리스트의 길이만큼 증가한다.
- 원하는 위치에 요소를 추가하고 싶을 때는 리스트의 특정 인덱스에 요소 하나를 추가할 수 있는 insert(인덱스, 요소)를 사용한다.
>>> a = [10, 20, 30] >>> a.insert(2, 500) # 리스트 a의 인덱스 2에 500을 추가함 >>> a [10, 20, 500, 30] >>> len(a) 4
- insert에서 자주 사용하는 패턴은 2가지가 있다.
- insert(0, 요소) : 리스트의 맨 처음에 요소를 추가
- insert(len(리스트), 요소) : 리스트의 끝에 요소를 추가
- 그리고 insert에 마지막 인덱스보다 큰 값을 지정하면 리스트 끝에 요소 하나를 추가할 수 있다.- len(리스트) 는 마지막 인덱스보다 1이 더 크기 때문에 리스트 끝에 값을 추가할 때 자주 사용하며 a.append(500)와 같은 방법이다.>>> a = [10, 20, 30] >>> a.insert(0, 500) # 리스트의 맨 처음에 500을 추가 >>> a [500, 10, 20, 30]
>>> a = [10, 20, 30] >>> a.insert(len(a), 500) # 리스트 a의 끝에 500을 추가 >>> a [10, 20, 30, 500]
- 특히 insert는 요소 하나를 추가하므로 insert에 리스트를 넣으면 append처럼 리스트 안에 리스트가 들어간다.
>>> a = [10, 20, 30] >>> a.insert(1, [500, 600]) # 리스트 a의 인덱스 1에 리스트를 추가 >>> a [10, [500, 600], 20, 30]
- 리스트 중간에 요소 여러 개를 추가하고 싶다면 슬라이스에 요소 할당하기를 활용하면 된다.
- a[1:1] = [500, 600]과 같이 시작 인덱스와 끝 인덱스를 같게 지정하면 해당 인덱스의 요소를 덮어쓰지 않으면서 요소 여러 개를 중간에 추가할 수 있다.>>> a = [10, 20, 30] >>> a[1:1] = [500, 600] # 리스트 a의 인덱스 1부터 500, 600을 추가 >>> a [10, 500, 600, 20, 30]
2022.01.12 - [Python 코딩도장] - 파이썬 코딩도장 Unit 11 정리 - 슬라이스에 요소 할당하기 참고
1-2. 리스트에서 요소 삭제하기
- 리스트에서 요소를 삭제하는 메서드는 2가지가 있다.
- pop : 마지막 요소 또는 특정 인덱스의 요소를 삭제
- remove : 특정 값을 찾아서 삭제
- pop()은 리스트의 마지막 요소를 삭제한 뒤 삭제한 요소를 반환한다.
>>> a = [10, 20, 30] >>> a.pop() # 리스트에서 마지막 요소 삭제한 뒤 30을 반환 30 >>> a [10, 20]
- 원하는 요소를 삭제하고 싶다면 해당 인덱스의 요소를 삭제한 뒤 삭제한 요소를 반환하는 pop(인덱스)를 사용한다.
- pop 대신 del을 사용해도 상관없긴 하다.>>> a = [10, 20, 30] >>> a.pop(1) # 리스트에서 인덱스1 삭제 20 >>> a [10, 30]
>>> a = [10, 20, 30] >>> del a[1] >>> a [10, 30]
- 리스트에서 원하는 값을 찾아 삭제하고 싶다면, 리스트에서 특정 값을 찾아서 삭제하는 remove(값)을 사용한다.
- 만약 리스트에 같은 값이 여러 개 있다면 처음 찾은 값을 삭제한다.>>> a = [10, 20, 30] >>> a.remove(20) # 리스트에서 20을 삭제 >>> a [10, 30]
>>> a = [10, 20, 30, 20] >>> a.remove(20) # 처음 찾은 하나만 삭제 >>> a [10, 30, 20]
1-3. 리스트에서 특정 값의 인덱스와 개수 구하기
- index(값)은 리스트에서 특정 값의 인덱스를 구하며, 같은 값이 여러 개일 경우 처음 찾은 인덱스를 구한다.(가장 작은 인덱스)
>>> a = [10, 20, 30, 15, 20, 40] >>> a.index(20) # 처음 찾은 인덱스를 구함 1
- count(값)은 리스트에서 특정 값의 개수를 구한다.
>>> a = [10, 20, 30, 15, 20, 40] >>> a.count(20) # 리스트에서 20의 개수 구하기 2
1-4. 리스트의 순서를 변경하기
- reverse()는 리스트에서 요소의 순서를 반대로 뒤집는다.
>>> a = [10, 20, 30, 15, 20, 40] >>> a.reverse() # 리스트의 순서를 뒤집음 >>> a [40, 20, 15, 30, 20, 10]
- sort()는 리스트의 요소를 작은 순서대로 정렬한다.(오름차순)
- sort() 또는 sort(reverse=False) : 리스트의 값을 작은 순서대로 정렬(오름차순)
- sort(reverse=True) : 리스트의 값을 큰 순서대로 정렬(내림차순)
>>> a = [10, 20, 30, 15, 20, 40]
>>> a.sort() # 값을 작은 순으로 정렬(오름차순)
>>> a
[10, 15, 20, 20, 30, 40]
- 파이썬은 리스트의 sort 메서드뿐만 아니라 내장 함수 sorted도 제공한다.
- sort와 sorted 모두 정렬을 해주는 함수지만, sort는 메서드를 사용한 리스트를 변경하고 sorted는 정렬된 새 리스트를 생성한다는 차이점이 있다.
>>> a = [10, 20, 30, 15, 20, 40] >>> a.sort() # a의 내용을 변경하여 정렬 >>> a [10, 15, 20, 20, 30, 40] >>> b = [10, 20, 30, 15, 20, 40] >>> sorted(b) # 정렬된 새 리스트를 생성 [10, 15, 20, 20, 30, 40]
1-5. 리스트의 모든 요소 삭제하기
- clear()를 이용하여 리스트의 모든 요소를 삭제할 수 있다.
>>> a = [10, 20, 30] >>> a.clear() >>> a []
- clear 대신 del a[ : ]와 같이 시작과 끝 인덱스를 생략하여 리스트의 모든 요소를 삭제하는 것도 가능하다.
>>> a = [10, 20, 30] >>> del a[:] # 리스트의 처음부터 끝까지의 요소를 삭제 >>> a []
1-6. 리스트를 슬라이스로 조작하기
- 리스트에서는 메서드를 사용하지 않고 슬라이스로 조작할 수 있다. - a[len(a):]는 시작 인덱스를 len(a)로 지정해서 리스트의 마지막 인덱스보다 1이 더 큰 상태인데, 이는 리스트 끝에서부터 시작하겠다는 뜻이다. (이때는 리스트의 범위를 벗어난 인덱스를 사용 가능)
>>> a = [10, 20, 30] >>> a[len(a):] = [500, 600] # a.extend([500, 600])와 동일, a 끝에 다른 리스트를 연결 >>> a [10, 20, 30, 500, 600]
>>> a = [10, 20, 30] >>> a[len(a):] = [500] # a.append(500)과 동일, 리스트 끝에 값을 하나 추가 >>> a [10, 20, 30, 500]
※ 리스트가 비어 있는지 확인하는 방법
- len함수를 사용하여 if 조건문으로 판단하면 리스트(시퀀스 객체)가 비어 있는지 확인할 수 있다.
if not len(seq): # 리스트가 비어 있으면 True if len(seq): # 리스트에 요소가 있으면 True
- 파이썬에서는 위의 방법보다 리스트(시퀀스 객체)를 바로 if 조건문으로 판단하는 방법을 권장한다.
if not seq: # 리스트가 비어 있으면 True if seq: # 리스트에 내용이 있으면 True
- 리스트가 비어 있는지 확인하는 방법은 리스트의 미지막 요소에 접근할 때 유용하게 사용할 수 있다.
>>> seq = [10, 20, 30] >>> seq[-1] # 리스트의 마지막 요소에 접근할 때는 인덱스를 -1로 지정 30
- 리스트가 비어 있을 경우에는 인덱스를 -1로 지정할 수 없다.
- 이때는 if 조건문을 활용하여 리스트가 요소에 있을 때만 마지막 요소를 가져오게 한다.만약 리스트가 비어 있을 경우에는 인덱스를 -1로 지정하면 에러가 발생합니다. >>> a = [] >>> a[-1] Traceback (most recent call last): File "<pyshell#3>", line 1, in <module> a[-1] IndexError: list index out of range
seq = [] if seq: # 리스트에 요소가 있는지 확인 print(seq[-1]) # 요소가 있을 때만(True일때만) 마지막 요소를 가져옴
'Python 코딩도장' 카테고리의 다른 글
파이썬 코딩도장 Unit 22 정리(3) - 리스트(튜플)의 최대/최소값, 합계 (0) | 2022.01.20 |
---|---|
파이썬 코딩도장 Unit 22 정리(2) : 리스트 (0) | 2022.01.19 |
파이썬 코딩도장 Unit 21 정리 : 터틀 그래픽스 (0) | 2022.01.17 |
파이썬 코딩도장 Unit 20 정리 : FizzBuzz (0) | 2022.01.16 |
파이썬 코딩도장 Unit 19 정리 : 중첩 루프 사용 (0) | 2022.01.16 |