리스트는 파이썬에서 가장 많이 사용되는 자료형 중 하나로, 여러 값을 하나의 변수에 저장할 수 있는 자료형이다. 리스트는 순서가 있으며, 변경 가능하고, 다양한 데이터 타입을 포함할 수 있다. 리스트는 대괄호 []로 감싸서 정의하며, 각 요소는 쉼표로 구분된다.
1. 리스트 정의 및 기본 사용법
# 빈 리스트
empty_list = []
# 요소가 있는 리스트
fruits = ["apple", "banana", "cherry"]
numbers = [1, 2, 3, 4, 5]
mixed_list = [1, "apple", 3.14, True]
print(fruits) # 출력: ['apple', 'banana', 'cherry']
print(numbers) # 출력: [1, 2, 3, 4, 5]
print(mixed_list) # 출력: [1, 'apple', 3.14, True]
2. 리스트 인덱싱 및 슬라이싱
인덱싱
리스트의 각 요소는 인덱스를 통해 접근할 수 있다. 인덱스는 0부터 시작한다.
print(fruits[0]) # 출력: apple
print(fruits[1]) # 출력: banana
print(fruits[2]) # 출력: cherry
# 음수 인덱스를 사용하여 리스트의 끝에서부터 접근
print(fruits[-1]) # 출력: cherry
print(fruits[-2]) # 출력: banana
print(fruits[-3]) # 출력: apple
슬라이싱
리스트의 일부를 잘라내어 새로운 리스트를 생성할 수 있다. 슬라이싱은 [start:end] 형식으로 작성하며, start는 포함되고 end는 포함되지 않는다.
print(fruits[0:2]) # 출력: ['apple', 'banana']
print(fruits[1:]) # 출력: ['banana', 'cherry']
print(fruits[:2]) # 출력: ['apple', 'banana']
print(fruits[:]) # 출력: ['apple', 'banana', 'cherry']
3. 리스트 수정
리스트는 변경 가능한 자료형이다. 따라서 요소를 추가, 수정, 삭제할 수 있다.
요소 수정
fruits[1] = "blueberry"
print(fruits) # 출력: ['apple', 'blueberry', 'cherry']
요소 추가
append(): 리스트의 끝에 요소를 추가한다.
insert(): 특정 위치에 요소를 추가한다.
# append
fruits.append("date")
print(fruits) # 출력: ['apple', 'blueberry', 'cherry', 'date']
# insert
fruits.insert(1, "banana")
print(fruits) # 출력: ['apple', 'banana', 'blueberry', 'cherry', 'date']
요소 삭제
remove(): 특정 값을 가진 첫 번째 요소를 삭제한다.
pop(): 지정한 위치의 요소를 제거하고, 그 값을 반환한다. 인덱스를 지정하지 않으면 마지막 요소를 제거한다.
del: 특정 위치의 요소를 삭제한다.
clear(): 리스트의 모든 요소를 삭제한다.
# remove
fruits.remove("banana")
print(fruits) # 출력: ['apple', 'blueberry', 'cherry', 'date']
# pop
fruits.pop(2)
print(fruits) # 출력: ['apple', 'blueberry', 'date']
# del
del fruits[1]
print(fruits) # 출력: ['apple', 'date']
# clear
fruits.clear()
print(fruits) # 출력: []
4. 리스트 탐색 및 정렬
탐색
index(): 리스트에서 특정 값의 첫 번째 위치를 반환한다.
count(): 리스트에서 특정 값의 개수를 반환한다.
fruits = ["apple", "banana", "cherry", "banana"]
print(fruits.index("banana")) # 출력: 1
print(fruits.count("banana")) # 출력: 2
정렬
sort(): 리스트를 오름차순으로 정렬한다. 매개변수 reverse=True를 사용하면 내림차순으로 정렬된다.
sorted(): 리스트를 정렬하여 새로운 리스트를 반환한다.
numbers = [5, 2, 9, 1, 5, 6]
# sort
numbers.sort()
print(numbers) # 출력: [1, 2, 5, 5, 6, 9]
# sorted
sorted_numbers = sorted(numbers, reverse=True)
print(sorted_numbers) # 출력: [9, 6, 5, 5, 2, 1]
5. 리스트의 기타 유용한 메서드
extend(): 다른 리스트의 요소를 추가한다.
copy(): 리스트의 얕은 복사본을 반환한다.
reverse(): 리스트의 요소 순서를 반대로 변경한다.
# extend
fruits = ["apple", "banana"]
more_fruits = ["cherry", "date"]
fruits.extend(more_fruits)
print(fruits) # 출력: ['apple', 'banana', 'cherry', 'date']
# copy
fruits_copy = fruits.copy()
print(fruits_copy) # 출력: ['apple', 'banana', 'cherry', 'date']
# reverse
fruits.reverse()
print(fruits) # 출력: ['date', 'cherry', 'banana', 'apple']
6. filter/reduce/map 함수를 활용한 데이터 변환
파이썬은 리스트와 같은 시퀀스 데이터 구조를 효과적으로 처리하기 위해 filter(), reduce(), map() 함수와 같은 고차 함수(high-order functions)를 제공한다. 이러한 함수들은 함수형 프로그래밍 스타일을 지원하며, 데이터의 변환 및 필터링을 간결하게 수행할 수 있게 한다.
map() 함수: 주어진 함수를 시퀀스의 각 요소에 적용하여 새로운 시퀀스를 반환한다.
함수: 시퀀스의 각 요소에 적용할 함수.
시퀀스: 리스트나 튜플과 같은 반복 가능한 객체.
map(함수, 시퀀스)
# 예제 1: 리스트의 각 요소를 제곱
numbers = [1, 2, 3, 4, 5]
squared_numbers = list(map(lambda x: x**2, numbers))
print(squared_numbers) # 출력: [1, 4, 9, 16, 25]
# 예제 2: 문자열 리스트를 정수 리스트로 변환
str_numbers = ["1", "2", "3", "4", "5"]
int_numbers = list(map(int, str_numbers))
print(int_numbers) # 출력: [1, 2, 3, 4, 5]
filter() 함수: 주어진 함수의 조건을 만족하는 시퀀스의 요소들만 반환한다.
함수: 시퀀스의 각 요소에 적용할 조건 함수. 이 함수는 True 또는 False를 반환해야 한다.
시퀀스: 리스트나 튜플과 같은 반복 가능한 객체.
filter(함수, 시퀀스)
# 예제 1: 리스트에서 짝수만 필터링
numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
even_numbers = list(filter(lambda x: x % 2 == 0, numbers))
print(even_numbers) # 출력: [2, 4, 6, 8, 10]
# 예제 2: 문자열 리스트에서 길이가 5 이상인 문자열만 필터링
words = ["apple", "banana", "cherry", "date"]
long_words = list(filter(lambda x: len(x) >= 5, words))
print(long_words) # 출력: ['apple', 'banana', 'cherry']
reduce() 함수: 시퀀스의 모든 요소를 누적하여 하나의 값으로 반환한다. reduce() 함수는 functools 모듈에서 제공된다.
함수: 두 개의 인수를 받아 누적된 결과를 반환하는 함수.
시퀀스: 리스트나 튜플과 같은 반복 가능한 객체.
from functools import reduce
reduce(함수, 시퀀스)
from functools import reduce
# 예제 1: 리스트 요소의 합 계산
numbers = [1, 2, 3, 4, 5]
sum_numbers = reduce(lambda x, y: x + y, numbers)
print(sum_numbers) # 출력: 15
# 예제 2: 리스트 요소의 곱 계산
product_numbers = reduce(lambda x, y: x * y, numbers)
print(product_numbers) # 출력: 120
종합 예제: 세 함수를 결합하여 사용
# 리스트에서 짝수의 제곱의 합 계산
numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
# 1. 짝수만 필터링
even_numbers = list(filter(lambda x: x % 2 == 0, numbers))
# 2. 각 요소를 제곱
squared_even_numbers = list(map(lambda x: x**2, even_numbers))
# 3. 제곱된 값의 합 계산
sum_squared_even_numbers = reduce(lambda x, y: x + y, squared_even_numbers)
print(sum_squared_even_numbers) # 출력: 220
7. 리스트 내포 (List Comprehension)
리스트 내포는 리스트를 간결하고 효율적으로 생성하는 방법이다. 일반적으로 for 반복문과 조건문을 사용하여 리스트를 생성한다.
[표현식 for 항목 in 반복가능객체 if 조건]
예제 1: 간단한 리스트 생성
squares = [x**2 for x in range(10)]
print(squares) # 출력: [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
예제 2: 조건을 포함한 리스트 생성
even_squares = [x**2 for x in range(10) if x % 2 == 0]
print(even_squares) # 출력: [0, 4, 16, 36, 64]
예제 3: 중첩된 리스트 내포
matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
flattened = [num for row in matrix for num in row]
print(flattened) # 출력: [1, 2, 3, 4, 5, 6, 7, 8, 9]
8. 리스트와 함수
리스트는 다양한 함수와 함께 사용될 수 있다. 가장 많이 사용되는 몇 가지 함수는 다음과 같다:
len(): 리스트의 길이를 반환한다.
max(): 리스트에서 가장 큰 값을 반환한다.
min(): 리스트에서 가장 작은 값을 반환한다.
sum(): 리스트의 모든 요소의 합을 반환한다.
any(): 리스트의 요소 중 하나라도 참이면 True를 반환한다.
all(): 리스트의 모든 요소가 참이면 True를 반환한다.
numbers = [1, 2, 3, 4, 5]
print(len(numbers)) # 출력: 5
print(max(numbers)) # 출력: 5
print(min(numbers)) # 출력: 1
print(sum(numbers)) # 출력: 15
print(any([0, 1, 2])) # 출력: True
print(all([0, 1, 2])) # 출력: False
print(all([1, 2, 3])) # 출력: True