Python - Python 리스트와 튜플 응용하기 - 1
Python
- Python 기본
- Python 숫자 계산하기
- Python 변수 만들기
- Python 출력 방법
- Python 불과 비교, 논리 연산자
- Python 문자열 사용하기
- Python 리스트와 튜플 사용하기
- Python 시퀀스 자료형 활용하기
- Python 딕셔너리 사용하기
- Python if 조건문으로 특정 조건일 때 코드 실행하기
- Python else를 사용하여 두 방향으로 분기하기
- Python elif를 사용하여 두 방향으로 분기하기
- Python for 반복문
- Python while 반복문
- Python break, continue로 반복문 제어하기
- Python 중첩루프
- Python FizzBuzz 문제
- Python 터틀 그래픽스로 그림 그리기
- Python 리스트와 튜플 응용하기
- Python 리스트와 튜플 응용하기 - 2
- Python 2차원 리스트 사용하기
- Python 문자열 응용하기
- Python 딕셔너리 응용하기
- Python 세트 사용하기
- Python 파일 사용하기
- Python 회문 판별과 N-gram 만들기
- Python 함수 사용하기
- Python 함수에서 위치 인수와 키워드 인수 사용하기
- Python 함수에서 재귀호출 사용하기
- Python 람다 표현식 사용하기
- Python 클로저 사용하기
- Python 클래스 사용하기
- Python 클래스 속성과 정적, 클래스 메서드 사용하기
- Python 클래스 상속 사용하기
- Python 두 점 사이의 거리 구하기
- Python 예외 처리 사용하기
- Python 이터레이터 사용하기
- Python 제너레이터 사용하기
- Python 코루틴 사용하기
- Python 데코레이터 사용하기
- Python 정규표현식 사용하기
- Python 모듈과 패키지 사용하기
- Python 모듈과 패키지 만들기
리스트와 튜플 응용하기
파이썬 리스트의 여러 기능들을 알아보자. 요소를 추가/삭제 하는 메소드와 정보를 조회하는 메서드 등이 있다. for문과 결합한 연속적이고 반복적인 값도 쉽게 처리할 수 있다.
1. 리스트 조작하기
리스트에 요소 추가하기
- append: 요소 하나를 추가
- extend: 리스트를 연결하여 확장
- insert: 특정 인덱스에 요소 추가
리스트에 요소 하나 추가하기
append를 사용해 리스트 끝에 요소 하나를 추가해보자. 리스트 [10, 20, 30]에 500을 추가하여 리스트는 [10, 20, 30, 500]이 된다. 리스트에 요소를 추가하는 것 이지 새로운 리스트가 생성되는 것은 아니다.
a = [10, 20, 30]
a.append(500)
a
[10, 20, 30, 500]
len(a)
4
비어있는 리스트에도 값을추가할 수 있다.
a = []
a.append(10)
a
[10]
리스트 안에 리스트 추가하기
append는 append(리스트)처럼 리스트를 넣으면 리스트 안에 리스트가 들어간다. 다음은 리스트 a안에 [500, 600]이 들어가서 중첩 리스트가 만들어진다. 요소 하나를 리스트 a의 끝에 추가해 주기 때문에 리스트의 길이가 5가 아닌 4가된다. 즉, append는 항상 리스트의 길이가 1씩 증가한다.
a = [10, 20, 30]
a.append([500, 600])
a
[10, 20, 30, [500, 600]]
len(a)
4
리스트 확장하기
리스트에 요소를 여러개 추가할 수도 있다. extend(리스트)를 사용하여 끝에 다른 리스트를 연결해 준다. 다음은 리스트 [10, 20, 30]에 다른 리스트 [500, 600]을 연결하여 [10, 20, 30, 500, 600]이 된다. 리스트를 연결 했음으로 리스트의 길이는 5가 된다.
a = [10, 20, 30]
a.extend([500 ,600])
a
[10, 20, 30, 500, 600]
len(a)
5
리스트의 특정 인덱스에 요소 추가하기
insert는 리스트의 특정 인덱스에 요소 하나를 추가한다. insert(인덱스, 요소)로 사용하고 아래는 [10, 20, 30]의 인덱스 2에 500을 추가하여 [10, 20, 500, 30]이 된다.
a = [10, 20, 30]
a.insert(2, 500) # index 2 위치에 500요소 추가
a
[10, 20, 500, 30]
len(a)
4
insert에서 자주 사용하는 패턴은 2가지이다.
- insert(0, 요소): 리스트의 맨 처음에 요소를 추가
- insert(len(리스트), 요소): 리스트 끝에 요소를 추가 리스트의 0번 인덱스에 500추가
a = [10, 20, 30]
a.insert(0, 500)
a
[500, 10, 20, 30]
insert를 하고 리스트의 마지막 인덱스보다 큰 값을 지정하면 리스트 끝에 요소 하나를 추가할 수 있다.
a = [10, 20, 30]
a.insert(len(a), 500)
a
[10, 20, 30, 500]
len(리스트)는 마지막 인덱스보다 1이 더 크기 때문에 리스트 끝에 값을 추가할때 자주 사용한다. 이방법은 a.append(500)과 같다. insert는 요소 하나를 추가하므로 insert에 리스트를 넣으면 append처럼 리스트 안에 리스트가 들어간다. 다음은 리스트 [10, 20, 30]의 인덱스 1에 리스트 [500, 600]을 추가하여 중첩 리스트가 된다.
a = [10, 20, 30]
a.insert(1, [500, 600])
a
[10, [500, 600], 20, 30]
만약 리스트 중간에 요소 여러개를 추가하고 싶다면 슬라이스 요소 할당하기를 활용하면 된다. 다음은 리스트 [10, 20, 30]의 인덱스 1부터 500, 600을 추가하여 [10, 500, 600, 20, 30]이 된다.
a = [10, 20, 30]
a[1:1] = [500, 600] #인덱스 1의위치에 500, 600요소 추가
a
[10, 500, 600, 20, 30]
리스트에서 요소 삭제하기
리스트에서 요소를 삭제하는 방법이다.
- pop: 마지막 요소 또는 특정 인덱스의 요소를 삭제
- remove: 특정 값을 찾아서 삭제
리스트에서 특정 인덱스의 요소를 삭제하기
pop()은 리스트의 마지막 요소를 삭제한 뒤 삭제한 요소를 반환한다. 다음은 리스트 [10, 20, 30]에서 pop으로 마지막 요소를 삭제한 뒤 30을 반환합니다. 따라서 리스트는 [10, 20]이 된다.
a = [10, 20, 30]
a.pop() #마지막 요소인 30을 삭제하고 반환한다.
30
a
[10, 20]
원하는 인덱스의 요소를 삭제하려면 pop에 인덱스를 지정하면 된다.
a = [10, 20, 30]
a.pop(1) #인덱스 1의 위치의 요소(20)를 삭제하고 반환한다.
20
a
[10, 30]]
# 또는
a = [10, 20, 30]
del a[1] #인덱스 1의 위치의 요소를 삭제하지만 반환하지는 않는다.
a
[10, 30]
리스트에서 특정 값을 찾아서 삭제하기
pop과 del은 인덱스로 요소를 삭제한다. 리스트에서 원하는 값을 찾아 삭제하고 싶을때는 remove를 사용한다. remove(값)은 리스트에서 특정 값을 찾아서 삭제한다. 다음은 리스트 [10, 20, 30]에서 20을 삭제하여 [10, 30]이 된다.
a = [10, 20, 30]
a.remove(20)
a
[10, 30]
만약 리스트에 같은 값이 여러 개 있을 경우 처음 찾은 값을 삭제한다.
a = [10, 20, 30, 20]
a.remove(20)
a
[10, 30, 20]
리스트로 스택과 큐 만들기
리스트 메서드로 스택(stack)과 큐(queue)를 만들 수 있다. 스택이란 한쪽으로만 들어오고 나가는 구조이다. ABC가들어오면 CBA순서로 나갈 수 있다. 큐라는 구조는 들어오는 곳과 나가는 곳이 따로 있는 구조이다. ABC가 들어가면 A가 먼저 삭제되고 나머지가 삭제되는 밀어내기 구조이다. append와 pop을 호출하는 그림을 90도 돌리면 스택의 모습이 된다.
여기서 pop() 대신 pop(0)을 사용하면 큐가 된다.
물론 append(), pop(0)이 아닌 insert(0, 요소), pop()을 사용해서 추가/삭제 방향을 반대로 해도 큐가 된다.
파이썬에서 스택은 리스트를 그대로 활용해도 되지만, 큐는 좀 더 효율적으로 사용할 수 있도록 덱(deque, double ended queue)이라는 자료형을 제공한다. 덱은 양쪽 끝에서 추가/삭제가 가능한 자료 구조다.
- deque(반복가능한객체)
from collections import deque # collections 모듈에서 deque를 가져옴
a = deque([10, 20, 30])
a
deque([10, 20, 30])
a.append(500) # 덱의 오른쪽에 500 추가
a
deque([10, 20, 30, 500])
a.popleft() # 덱의 왼쪽 요소 하나 삭제
10
a
deque([20, 30, 500])
리스트에서 특정 값의 인덱스 구하기
index(값)은 리스트에서 특정 값의 인덱스를 구한다. 이때 같은 값이 여러 개일 경우 처음 찾은 인덱스를 구한다(가장 작은 인덱스). 다음은 20이 두 번째에 있으므로 인덱스 1이 나온다.
a = [10, 20, 30, 15, 20, 40]
a.index(20)
1
특정 값의 개수 구하기
count(값)은 리스트에서 특정 값의 개수를 구한다. 다음은 리스트 a에서 20의 개수를 구합니다.
a = [10, 20, 30, 15, 20, 40]
a.count(20)
2
특정 값의 개수 구하기
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): 리스트의 값을 큰 순서대로 정렬(내림차순)
- 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]
리스트의 모든 요소를 삭제하기
clear()는 리스트의 모든 요소를 삭제한다.
a = [10, 20, 30]
a.clear()
a
[]
# clear대신 del a[:]로 리스트 전체를 지정해 모든 요소를 삭제할 수도 있다.
a = [10, 20, 30]
del a[:]
a
[]
리스트를 슬라이스로 조작하기
리스트는 메서드를 사용하지 않고, 슬라이스로 조작할 수도 있다. 다음은 리스트 끝에 값이 한개 들어있는 리스트를 추가한다. a[len(a):] = [500]과 같이 값이 한 개 들어있는 리스트를 할당하면 리스트 a 끝에 값을 한 개 추가하며 a.append(500)과 같다.
a = [10, 20, 30]
a[len(a):] = [500]
a
[10, 20, 30, 500]
a[len(a):] = [500, 600]과 같이 요소가 여러 개 들어있는 리스트를 할당하면 리스트 a 끝에 다른 리스트를 연결하며 a.extend([500, 600])과 같다.
a = [10, 20, 30]
a[len(a):] = [500, 600]
a
[10, 20, 30, 500, 600]
리스트를 슬라이스로 조작하기
리스트(시퀀스 객체)가 비어있는지 확인 하려면 if조건문을 사용하면 된다.
if not len(seq): # 리스트가 비어 있으면 True
if len(seq): # 리스트에 요소가 있으면 True
위와같이 판단할 수도 있지만 리스트(시퀀스 객체)를 바로 if조건문으로 판단하는 방법이 좋다.
if not seq: # 리스트가 비어 있으면 True
if seq: # 리스트에 요소가 있으면 True
리스트가 비어있는 지확인하는 방법은 리스트의 마지막 요소에 접근할 때 유용하게 사용할 수 있다. 리스트가 비어있는 경우에 인덱스를 -1로 지정하면 에러가 발생한다. 이때는 if 조건문을 활용해 리스트에 요소가 있을 때 만 마지막 요소를 가져오면 된다.
seq = []
if seq: # 리스트에 요소가 있는지 확인
print(seq[-1]) # 요소가 있을 때만 마지막 요소를 가져옴
2. 리스트의 할당과 복사 알아보기
할당과 복사는 비슷한것 같지만 큰 차이가 있다. 아래와 같이 b = a로 리스트를 다른 변수에 할당하면 리스트는 두 개가 될 것 같지만 실제로는 리스트가 한개이다.
a = [0, 0, 0, 0, 0]
b = a
a와 b를 is 연산자로 비교해보면 True가 나온다. 즉, 변수 이름만 다를 뿐 리스트 a와 b는 같은 객체이다. a와 b는 같으므로 b[2] = 99와 같이 리스트 b의 요소를 변경하면 a와 b에 모두 반영된다.
a is b
True
>>> b[2] = 99
>>> a
[0, 0, 99, 0, 0]
>>> b
[0, 0, 99, 0, 0]
리스트 a와 b를 완전히 두 개로 만들려면 copy 메서드로 모든 요소를 복사해야 한다. b = a.copy()와 같이 copy를 사용한 뒤 b에 할당해주면 리스트 a의 요소가 모두 b에 복사된다.
a = [0, 0, 0, 0, 0]
b = a.copy()
a와 b를 is 연산자로 비교해 보면 False가 나온다. 즉, 두 리스트는 다른 객체이다. 그러나 복사된 요소는 같으므로 ==로 비교하면 True가 나온다. 이제 리스트 a와 b는 별개이므로 한쪽의 값을 변경해도 다른 리스트에 영향을 미치지 않는다. b의 요소를 변경해도 a의요소는 바뀌지 않았다.
>>> a is b
False
>>> a == b
True
>>> b[2] = 99
>>> a
[0, 0, 0, 0, 0]
>>> b
[0, 0, 99, 0, 0]
3. 반복문으로 리스트의 요소를 모두 출력하기
리스트와 반복문을 사용해 모든 요소를 출력해 보자.
for 반복문으로 요소 출력하기
for 반복문은 in뒤에 리스트를 지정한다.
for 변수 in 리스트:
반복할 코드
다음은 for로 리스트 a의 모든 요소를 출력한다. for i in a:는 리스트 a에서 요소를 꺼내서 i에 저장하고, 꺼낼 때마다 코드를 반복한다.
a = [38, 21, 53, 62, 19]
for i in a:
print(i)
38
21
53
62
19
인덱스와 요소를 함께 출력하기
for 반복문으로 요소를 출력할 때 인덱스도 함께 출력 해야 할 이때는 enumerate를 사용한다.
- for 인덱스, 요소 in enumerate(리스트):
for index, value in enumerate(a):와 같이 enumerate에 리스트를 넣으면 for 반복문에서 인덱스와 요소를 동시에 꺼내 올 수 있다.
a = [38, 21, 53, 62, 19]
for index, value in enumerate(a):
print(index, value)
0 38
1 21
2 53
3 62
4 19
앞의 코드는 인덱스를 0부터 출력하는데 1부터 출력하고 싶을 수도 있습니다. 다음과 같이 그냥 index + 1을 출력하면 되겠다.
for index, value in enumerate(a):
print(index + 1, value)
1 38
2 21
3 53
4 62
5 19
위와같이 +1을 해줘도 되지만 다음과 같이 enumerate에 start를 지정해주면 된다. enumerate(a, start=1)처럼 start에 1을 지정하여 인덱스가 1부터 시작하도록 만들었다.
- for 인덱스, 요소 in enumerate(리스트, start=숫자):
for index, value in enumerate(a, start=1):
print(index, value)
1 38
2 21
3 53
4 62
5 19
for 반복문에서 인덱스로 요소를 출력하기
for에서 인덱스를 지정하여 요소를 가져올 때는 range에 len으로 리스트의 길이(요소 개수)를 구해서 넣어주면 인덱스를 순서대로 만들어준다.
a = [38, 21, 53, 62, 19]
for i in range(len(a)):
print(a[i])
38
21
53
62
19
while반복문으로 요소 출력하기
이번에는 while 반복문으로 리스트의 요소를 출력해보자. len(a)는 5이고 index의 가장 큰 값은 4이기 때문에 i가 0부터 4까지 while문이 돌게 된다.
a = [38, 21, 53, 62, 19]
i = 0
while i < len(a):
print(a[i])
i += 1
38
21
53
62
19
만약 i <= len(a)처럼 <=을 사용하면 리스트의 범위를 벗어나게 되므로 주의해야 한다.
a = [38, 21, 53, 62, 19]
i = 0
while i <= len(a):
print(a[i])
i += 1
38
21
53
62
19
Traceback (most recent call last):
File "<stdin>", line 2, in <module>
IndexError: list index out of range
while 반복문 안에서 요소를 출력할 때는 print(a[i])와 같이 리스트의 인덱스 부분에 i를 지정하여 출력한다. 그다음에는 i가 1씩 증가하도록 만들면 된다.
while i < len(a):
print(a[i])
i += 1
Subscribe to My Coding Practice Gym
Get the latest posts delivered right to your inbox