리스트란 무엇인가요?
안녕하세요, 여러분! 오늘 우리가 알아볼 주제는 파이썬에서 가장 기본적이면서도 중요한 자료구조인 '리스트(List)'입니다. 리스트가 무엇일까요?
리스트란 순서가 있는 객체들의 모음을 말합니다. 예를 들어 과일 이름들의 모음이 있다면 ['apple', 'banana', 'cherry'] 이렇게 리스트로 표현할 수 있습니다. 또 숫자들의 모음도 [1, 2, 3, 4, 5] 와 같이 리스트로 나타낼 수 있죠.
리스트의 가장 큰 특징은 서로 다른 자료형의 요소들을 하나의 리스트 안에 포함시킬 수 있다는 점입니다. 예를 들어 [1, 3.14, 'hi', True] 처럼 정수, 실수, 문자열, 불린 값을 한 리스트에 담을 수 있습니다.
리스트는 프로그래밍에서 가장 많이 사용되는 자료구조 중 하나입니다. 우리가 작성하는 대부분의 프로그램에는 필수적으로 리스트가 사용되므로 리스트의 사용법을 제대로 익히는 것이 매우 중요합니다. 그럼 이제부터 리스트에 대해 자세히 알아보도록 하겠습니다.

리스트의 생성과 인덱싱
파이썬에서 리스트를 만드는 방법은 간단합니다. 대괄호 [] 안에 쉼표(,)로 구분하여 원하는 값들을 넣기만 하면 됩니다.
fruits = ['apple', 'banana', 'cherry']
numbers = [1, 2, 3, 4, 5]
mixed = [1, 3.14, 'hi', True]
empty = [] # 빈 리스트
리스트를 만들었다면 인덱스를 통해 리스트의 특정 원소에 접근할 수 있습니다. 파이썬 인덱스는 0부터 시작합니다.
fruits = ['apple', 'banana', 'cherry']
print(fruits[0]) # 'apple' 출력
print(fruits[2]) # 'cherry' 출력
인덱싱 할 때는 음수 값을 사용할 수도 있습니다. 이 경우 오른쪽에서부터 원소를 가리킵니다.
print(fruits[-1]) # 'cherry' 출력
print(fruits[-3]) # 'apple' 출력
그리고 슬라이싱을 통해 리스트의 일부분을 잘라낼 수 있습니다. 기본 문법은 list[start:stop:step]으로, start는 포함하고 stop은 제외합니다.
numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
print(numbers[2:7]) # [3, 4, 5, 6, 7] 출력
print(numbers[::2]) # [1, 3, 5, 7, 9] 출력 (step=2)
print(numbers[::-1]) # [10, 9, 8, 7, 6, 5, 4, 3, 2, 1] 출력 (역순)
이처럼 인덱싱과 슬라이싱을 활용하면 리스트의 원소에 자유롭게 접근할 수 있습니다. 리스트의 생성과 접근 방법을 충분히 익혔다면, 이제 리스트 조작 방법을 알아볼 차례입니다.
리스트 조작 및 관련 메서드
리스트는 다양한 메서드를 지원하여 손쉽게 조작할 수 있습니다. 우선 리스트에 새로운 원소를 추가하는 방법부터 알아보겠습니다.
fruits = ['apple', 'banana']
fruits.append('cherry') # 리스트 끝에 'cherry' 추가
print(fruits) # ['apple', 'banana', 'cherry'] 출력
fruits.insert(1, 'orange') # 인덱스 1에 'orange' 삽입
print(fruits) # ['apple', 'orange', 'banana', 'cherry'] 출력
리스트 내 특정 원소를 제거하려면 remove() 또는 del 키워드를 사용합니다.
fruits.remove('banana') # 'banana' 제거
print(fruits) # ['apple', 'orange', 'cherry'] 출력
del fruits[0] # 인덱스 0 원소 삭제
print(fruits) # ['orange', 'cherry'] 출력
리스트를 정렬하고 싶다면 sort() 메서드를 활용하면 됩니다.
numbers = [5, 1, 3, 7, 2]
numbers.sort() # 리스트 정렬
print(numbers) # [1, 2, 3, 5, 7] 출력
혹은 reverse() 메서드로 리스트를 역순으로 뒤집을 수도 있습니다.
numbers.reverse()
print(numbers) # [7, 5, 3, 2, 1] 출력
그리고 리스트의 길이를 알고 싶다면 len() 함수를 사용합니다.
print(len(numbers)) # 5 출력
리스트에는 이 외에도 count(), index(), extend() 등 많은 메서드들이 있습니다. 효과적으로 리스트를 다루려면 이런 메서드들의 사용법을 잘 익혀두는 것이 좋습니다.
지금까지 리스트의 생성, 인덱싱, 그리고 다양한 메서드에 대해 살펴보았습니다. 리스트는 파이썬에서 가장 중요한 자료구조 중 하나입니다. 다음으로는 리스트 내포와 같은 고급 기능들을 알아보겠습니다.
리스트 내포와 연산
파이썬에서는 리스트를 리스트 내포(List Comprehension) 방식으로 간편하게 생성할 수 있습니다. 리스트 내포 문법은 다음과 같습니다.
[expression for item in iterable]
예를 들면 다음과 같이 짝수의 리스트를 쉽게 만들 수 있습니다.
even_numbers = [x for x in range(10) if x % 2 == 0]
print(even_numbers) # [0, 2, 4, 6, 8] 출력
이뿐만 아니라, 리스트 내포를 중첩해서 사용하면 2차원 이상의 리스트도 간단히 만들 수 있습니다.
nested_list = [[x*y for y in range(5)] for x in range(4)]
print(nested_list)
# [[0, 0, 0, 0, 0],
# [0, 1, 2, 3, 4],
# [0, 2, 4, 6, 8],
# [0, 3, 6, 9, 12]] 출력
리스트 내포 덕분에 복잡한 for 반복문과 조건문 없이도 리스트를 깔끔하게 생성할 수 있습니다.
그리고 리스트와 함께 다양한 연산도 가능합니다. 예를 들어 리스트 간 더하기와 곱하기 연산을 할 수 있습니다.
list1 = [1, 2, 3]
list2 = [4, 5, 6]
list3 = list1 + list2
print(list3) # [1, 2, 3, 4, 5, 6] 출력
list4 = list1 * 3
print(list4) # [1, 2, 3, 1, 2, 3, 1, 2, 3] 출력
또한 in 키워드를 통해 리스트 내 특정 원소의 포함 여부를 확인할 수 있습니다.
fruits = ['apple', 'banana', 'cherry']
print('banana' in fruits) # True 출력
print('orange' in fruits) # False 출력
이렇게 리스트에는 다양한 고급 기능과 연산이 존재합니다. 이를 잘 활용한다면 반복문 없이도 간결한 코드로 원하는 리스트를 만들 수 있습니다.
많은 분들이 리스트 내포나 리스트 연산을 어렵게 생각하시지만, 점점 익숙해지면 이렇게 편리한 기능들이 코딩을 한결 수월하게 해줄 것입니다. 그럼 마지막으로 리스트 복사에 대해 알아보겠습니다.
리스트 복사의 정확한 이해
리스트를 다른 변수에 할당하면 복사가 된 것일까요? 아니면 같은 객체를 가리키게 될까요? 이 부분에 대해서 꼭 이해해야 합니다.
original = [1, 2, 3]
copy = original # 복사한 것일까요?
copy[0] = 'x'
print(original) # ['x', 2, 3] 출력
결과를 보면 원본 리스트의 값도 바뀐 것을 알 수 있습니다. 즉, 리스트를 이렇게 단순히 할당하면 복사가 아니라 객체에 대한 참조만 복사된 것입니다.
그렇다면 리스트를 정확하게 복사하려면 어떻게 해야 할까요? 간단한 방법으로는 슬라이스 연산자[:]를 활용하는 것입니다.
original = [1, 2, 3]
copy = original[:] # 슬라이싱으로 복사
copy[0] = 'x'
print(original) # [1, 2, 3] 출력
print(copy) # ['x', 2, 3] 출력
이렇게 하면 원본 리스트를 그대로 유지한 채 복사본 리스트를 따로 만들 수 있습니다. 하지만 이 방식에도 한계가 있습니다. 만약 리스트 안에 중첩된 리스트가 있다면 문제가 생깁니다.
original = [1, 2, [3, 4]]
copy = original[:]
copy[2][0] = 'x'
print(original) # [1, 2, ['x', 4]] 출력
# 중첩 리스트는 참조만 복사됨
이런 문제를 피하려면 copy 모듈의 deepcopy() 함수를 이용하면 됩니다.
import copy
original = [1, 2, [3, 4]]
copy = copy.deepcopy(original)
copy[2][0] = 'x'
print(original) # [1, 2, [3, 4]] 출력
print(copy) # [1, 2, ['x', 4]] 출력
deepcopy()는 내부에 있는 중첩 리스트까지 완전히 새로운 객체로 복사하므로, 원본과 복사본이 완벽하게 분리됩니다.
이렇게 리스트 복사에는 여러 가지 주의사항이 있습니다. 단순 할당으로는 참조만 복사되고, 슬라이싱을 사용해도 중첩된 객체는 제대로 복사되지 않습니다. 그러므로 상황에 맞게 올바른 복사 방식을 사용해야 합니다.
물론 이런 리스트 복사에 대한 깊이 있는 내용은 초심자들에게 어렵게 느껴질 수 있습니다. 하지만 점점 실력이 쌓이면서 리스트 복사의 중요성을 절실히 깨닫게 될 것입니다. 그때가 되면 이번 내용이 큰 도움이 될 것입니다.
요약
- 리스트는 순서가 있는 객체들의 모음으로 서로 다른 자료형의 원소를 포함할 수 있습니다.
- 인덱싱과 슬라이싱을 통해 리스트의 원소에 자유롭게 접근할 수 있습니다.
- append(), insert(), remove(), sort(), reverse() 등 다양한 메서드로 리스트를 조작할 수 있습니다.
- 리스트 내포를 활용하면 반복문 없이도 리스트를 편리하게 생성할 수 있습니다.
- 리스트 간 연산(+, *), 포함 여부 확인(in) 등의 기능도 있습니다.
- 리스트 복사 시에는 단순 할당, 슬라이싱, deepcopy() 등의 방법이 있으며, 상황에 맞는 적절한 방식을 사용해야 합니다.
참고 자료
[1] Lutz, M. (2013). Learning Python (5th ed.). O'Reilly Media.
[2] Matthes, E. (2019). Python Crash Course: A Hands-On, Project-Based Introduction to Programming (2nd ed.). No Starch Press.
[3] Guttag, J. V. (2016). Introduction to Computation and Programming Using Python (2nd ed.). MIT Press.
[4] Downey, A. B. (2015). Think Python: How to Think Like a Computer Scientist (2nd ed.). O'Reilly Media.
[5] Python 공식 문서 - 리스트: https://docs.python.org/3/tutorial/introduction.html#lists
[6] Python 공식 문서 - 리스트 컴프리헨션: https://docs.python.org/3/tutorial/datastructures.html#list-comprehensions
한 고대 문서 이야기
여기 한 고대 문서가 있습니다. 이 문서는 B.C. 1,500년 부터 A.D 100년까지 약 1,600 여 년 동안 기록되었습니다. 이 문서의 저자는 약 40 명입니다. 이 문서의 고대 사본은 25,000 개가 넘으나, 사본간 오
gospel79.tistory.com
유튜브 프리미엄 월 1만원 할인받고 월 4000원에 이용하는 방법
올해 5월부터 월 8000원 정도이던 유튜브 프리미엄 요금이 15000원 정도로 인상됩니다. 각종 OTT 서비스, ChatGPT 같은 서비스들이 늘어나다보니 이런 거 몇 개만 이용하더라도 월 이용요금이 5만원을
stock79.tistory.com
"이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."
'IT > 파이썬 기초 완전 정복' 카테고리의 다른 글
| 파이썬 집합 자료형 사용하기 (13) (1) | 2024.04.20 |
|---|---|
| 파이썬 딕셔너리 자료구조 익히기 (12) (3) | 2024.04.20 |
| 파이썬 튜플 활용법 배우기 (11) (1) | 2024.04.20 |
| 파이썬 예외 처리(try, except) 방법 (9) (1) | 2024.04.20 |
| 파이썬 파일 입출력 다루기 (8) (1) | 2024.04.20 |
댓글