Python 시리즈 8
[Python] #6 리스트

참고: codetree Trail 0의 Chapter 6
1. 리스트
여러 개의 값을 순서대로 저장할 수 있는 자료형
- 정수, 문자열, 실수 등 다양한 자료형을 함께 넣을 수 있음
- 대괄호(
[])로 정의됨 - 각 요소는 순서대로 위치(
인덱스, index)를 가짐 - 인덱스는
0부터 시작 변경 가능한, mutable자료형이므로 값을 추가·수정·삭제 가능
mixed = [1, "두 번째", 3.0, True]
empty = []
1-1. 리스트 생성 & 초기화
1-1-1. 직접 값 나열
colors = ["빨강", "초록", "파랑"]
1-1-2. list() 함수 사용
letters = list("abcde")
print(letters) # ['a', 'b', 'c', 'd', 'e']
1-1-3. input().split() 사용
fruit_list = input().split() # 사과 바나나 체리
print(fruit_list) # ['사과', '바나나', '체리']
1-1-4. 빈 리스트 생성
empty_list = []
1-2. 리스트 덧셈(결합)
+연산자로 두 개 이상의 리스트를 결합하여 새로운 리스트를 생성- 원본 리스트는 변경되지 않음
- 새로운 리스트는 합쳐지는 리스트의 요소를 순서대로 포함한다
list1 = [3, 1, 4]
list2 = [1, 5, 9]
print(list1 + list2) # 출력: [3, 1, 4, 1, 5, 9]
print(list2 + list1) # 출력: [1, 5, 9, 3, 1, 4]
1-3. 리스트 곱셈(반복)
*연산자로 특정 리스트를 지정한 횟수만큼 반복한 새로운 리스트를 생성- 반복 횟수는 음수가 아닌 정수 값이다.
- 패턴이나 동일한 데이터의 반복이 필요한 경우 사용
list1 = [1, 2, 3]
print(list1 * 3) # 출력: [1, 2, 3, 1, 2, 3, 1, 2, 3]
1-4. 인덱싱
리스트의 특정 요소를 접근하는 방식
0부터시작함-1(뒤)에서부터 시작하는 음수 인덱스도 지원 O (시퀀스의 길이를 모를 때도 마지막 요소에 쉽게 접근 가능)
| 양수 인덱스 | 0 | 1 | 2 | 3 | 4 |
|---|---|---|---|---|---|
| 음수 인덱스 | -5 | -4 | -3 | -2 | -1 |
| 요소 | 사과 | 바나나 | 오렌지 | 포도 | 체리 |
print(fruits[-1]) # 체리
print(fruits[-3]) # 오렌지
print(fruits[22]) # 인덱스가 리스트의 범위를 초과하면 오류(IndexError) 발생
1-4-1. 리스트 값 수정
- 리스트 특정 위치의 요소(값) 변경
fruits = ["사과", "바나나", "체리"]
fruits[1] = "딸기"
print(fruits) # ['사과', '딸기', '체리']
1-5. 주요 메서드 & 함수
1-5-1. 메서드
특정 자료형이 고유한 기능을 갖고 있는 특별한 함수 (집계 함수 포함)
리스트명.append(요소) 리스트명.insert(위치, 요소)
- 자료형 이름 뒤에 점(.)을 찍고 메서드 이름을 붙임
(1) append()
- 리스트의
끝에 새로운 요소추가
fruits = ["사과", "바나나", "체리"]
fruits.append("오렌지")
print(fruits) # ['사과', '바나나', '체리', '오렌지']
(2) insert()
- 리스트의
특정(인덱스) 위치에 요소삽입
fruits = ["사과", "바나나", "체리", "오렌지"]
fruits.insert(1, "키위")
print(fruits) # ['사과', '키위', '바나나', '체리', '오렌지']
(3) remove()
- 리스트에서
첫 번째로일치하는 특정 요소제거 - 삭제하려는 특정 요소가 리스트에 없을 경우
ValueError발생
fruits = ["사과", "키위", "바나나", "체리", "오렌지"]
fruits.remove("바나나")
print(fruits) # ['사과', '키위', '체리', '오렌지']
(4) pop()
- 리스트의 지정한 인덱스의 요소를
제거하고반환 - 인덱스를 지정하지 않으면
마지막요소가 제거됨
fruits = ["사과", "키위", "체리", "오렌지"]
last_fruit = fruits.pop()
print(last_fruit) # 오렌지
print(fruits) # ['사과', '키위', '체리']
second_fruit = fruits.pop(1)
print(second_fruit) # 키위
print(fruits) # ['사과', '체리']
(5) sort()
- 리스트를
오름차순으로 정렬 (기본) 내림차순은reverse=True인자로 정렬
# 기본 (오름차순)
numbers = [5, 2, 9, 1, 5, 6]
numbers.sort()
print(numbers) # 출력: [1, 2, 5, 5, 6, 9]
# 내림차순
numbers = [5, 2, 9, 1, 5, 6]
numbers.sort(reverse=True)
print(numbers) # [9, 6, 5, 5, 2, 1]
(6) reverse()
- 리스트의 요소 순서를
반대로뒤집음 - 원본 데이터에 영향 X (반환 X)
fruits = ["사과", "바나나", "체리"]
fruits.reverse()
print(fruits) # ['체리', '바나나', '사과']
(7) count()
- 리스트의 특정 요소가 몇 번 등장하는지
개수세어 반환
numbers = [1, 2, 3, 2, 2, 4]
print(numbers.count(2)) # 3
(8) index()
- 리스트의 특정 요소가
처음으로 등장하는 위치(인덱스)를 반환 - 특정 요소가 존재하지 않으면
ValueError발생 - 특정 요소가
여러 개면첫 번째인덱스만 반환
# 예시1
fruits = ["사과", "바나나", "체리", "바나나"]
print(fruits.index("바나나")) # 1
# 예시2
numbers = [10, 20, 30, 20, 40]
print(numbers.index(20)) # 1
(9) len()
- 리스트의 요소
개수(길이)를 반환하는함수(메서드 X) - 튜플, 딕셔너리 등 다른 자료형에도 적용 가능 O
fruits = ["사과", "체리"]
print(len(fruits)) # 2
1-6. 1차원 배열 응용
1차원 배열: 선형으로 나열된 데이터
1-6-1. 인덱스 활용
- 요소의 인덱스에 직접 접근 O
# 기본 구조
for i in range(len(리스트)):
실행할 코드
``
```python
# 예시1 (리스트 요소에 2배씩 곱하기)
original = [3, 1, 4, 1, 5]
doubled = []
for i in range(len(original)): # 리스트 인덱스 순회
doubled.append(original[i] * 2)
print(doubled) # [6, 2, 8, 2, 10]
``
### 1-6-2. 요소를 `직접 순회`하는 for문
- 요소의 인덱스에 직접 접근 불가 (제한적)
```python
# 기본 구조
for 변수 in 리스트:
실행할 코드
# 예시1 (리스트 요소에 2배씩 곱하기)
original = [3, 1, 4, 1, 5]
doubled = []
for x in original:
doubled.append(x * 2)
print(doubled) # [6, 2, 8, 2, 10]
1-7. 리스트 입력받기
- 사용자로부터 여러 개의 정수를 한 번에 입력받아 리스트로 저장하는 경우
input()함수와map()함수를 조합하여 사용
리스트이름 = list(map(변환함수, input().split())) # list(...): map 객체를 리스트로 변환
# 예시1
numbers = list(map(int, input().split())) # 10 20 30 40 50
print(numbers) # [10, 20, 30, 40, 50]
1-8. 리스트 컴프리헨션 (<->for문)
반복문과 간단한표현식을 사용하여 기존의 리스트나 반복 가능한 객체로부터 새로운 리스트를한 줄로 간결하게 만드는 방법
- 먼저
빈 리스트 생성후 반복문을 통해 요소를 하나씩 순차적으로 추가하는 for문과는 달리 가독성이 좋음
# 기본 구조
새로운_리스트 = [표현식 for 변수 in 시퀀스]
1-8-1. 시퀀스sequence
반복 가능한 것들 (리스트, range())
1-8-2. for 변수 in 시퀀스
- 의미: 시퀀스에서 하나씩 꺼내 변수에 담기 (≈for문)
1-8-3. 표현식expression
- 각 반복에서 리스트에 넣을 값을
결정
# 예시1 (기존 리스트 요소에 2를 곱한 새로운 리스트 생성)
arr = [1, 2, 3, 4] # for x in arr: arr의 각 숫자를 x에 하나씩 대입
new_arr = [x * 2 for x in arr] # x에 2를 곱한 값을 new_arr에 추가
print(new_arr) # [2, 4, 6, 8] # [2, 4, 6, 8] 이라는 새 리스트 생성됨
# 예시2 (모든 요소를 9으로 채우기)
zeros = [0 for x in range(10)]
print(zeros) # [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
# 예시3 (반복적인 사용자 입력(받는) 처리)
n = int(input("입력할 문자열의 개수: ")) # n개의 문자열을 입력받기 위해 사용자로부터 숫자 입력받기
arr = [input("문자열 입력: ") for _ in range(n)] # 리스트 컴프리헨션을 사용하여 n번 반복하며 각 문자열을 입력받아 arr 리스트에 저장
print(arr) # 리스트 arr 출력
1-9. 2차원 배열
1-9-1. 개념
배열 안에 배열이 있는 구조 (배열들의 배열)
엑셀 표·격자처럼
가로(행·row)와세로(열·column)를 가진 구조
1차원 배열들을 이어 붙인 모양
리스트를 요소로 같는 리스트 (List of Lists)
- 구성: 행과 열
- 형태: => a[i][j]

# 예시 1 (3행 4열의 이차원 배열)
[
[a00, a01, a02, a03],
[a10, a11, a12, a13],
[a20, a21, a22, a23]
]
- 가장 바깥쪽 리스트가
행들을 모아놓은 것 - 각 내부 리스트가
한 행에 해당 - 내부 리스트의 각 요소은
열 값
1-9-2. 생성 & 입력
append()활용
(1) for 루프 사용
- 코드가 길어질 수 있고, 중첩 루프가 복잡해질 가능성 O
- 단계별로 요소를 추가하는 과정이 명시적으로 드러남
rows = int(input("행 개수를 입력하세요: ")) # 3
cols = int(input("열 개수를 입력하세요: ")) # 3
matrix = []
for _ in range(rows):
# 한 줄씩 입력받아 리스트로 변환 후 matrix에 추가
row_date = list(map(int, input("값을 공백으로 구분하여 입력하세요: ").split())) # 3 2 1\n4 5 6\n9 8 7
matrix.append(row_data)
print(matrix) # [[3, 2, 1], [4, 5, 6], [9, 8, 7]]
(2) 리스트 컴프리헨션 사용
[ 넣을_값 for 변수 in 반복대상 ]
- 한두 줄로 복잡한 로직 표현 가능
# 예시 1
rows = int(input("행(Row) 개수를 입력하세요: "))
cols = int(input("열(Column) 개수를 입력하세요: "))
# 각 행의 입력을 2차원 정수 리스트 생성(변환)
matrix = [list(map(int, input("값을 공백으로 구분하여 입력하세요: ").split())) for _ in range(rows)]
print("입력받은 2차원 배열(matrix):")
print(matrix)
matrix = [[1, -1], [0, 5]]
rows = 2
cols = 2
# 각 row의 element에 2를 곱하여 새로운 new_row 생성 (내부)
new_matrix = [
[element * 2 for element in row]
for row in matrix
]
# for row in matrix 원본 matrix의 각 row에 대해 새로운 new_matrix 생성 (외부)
print("새롭게 생성된 배열(new_matrix) (리스트 컴프리헨션 사용):")
for row in new_matrix:
print(row)
(3) 원본 배열 복사
# 예시1 (모든 요소 2배로 복사)
matrix = [[1, -1], [0, 5]]
rows = 2
cols = 2
new_matrix = []
for i in range(rows):
new_row = []
for j in range(cols):
# 각 요소에 2를 곱하여 새로운 행에 추가
new_row.append(matrix[i][j] * 2)
new_matrix.append(new_row)
print("새롭게 생성된 배열(new_matrix):")
for row in new_matrix:
print(row)
# 출력
"""
새롭게 생성된 배열(new_matrix):
[2, -2]
[0, 10]
"""
1-9-3. 탐색(순회) & 출력
(1) 이중 for 문 사용
matrix = [[3, 1], [4, 2]]
rows = 2
cols = 2
for i in range(rows): # 행 인덱스 반복
for j in range(cols): # 열 인덱스 반복
print(matrix[i][j], end=" ")
print() # 각 행이 끝날 때 줄바꿈
1-9-4. 값 접근 & 변경
- 접근/변경하고자 하는 인덱스 확보 후, 유효한 범위(인덱스 에러 방지)인지 확인하여 값을 읽거나 변경
matrix = [[1, -1], [0, 5]]
rows = 2
cols = 2
r_idx = int(input("접근하고 싶은 행 인덱스를 입력하세요: "))
c_idx = int(input("접근하고 싶은 열 인덱스를 입력하세요: "))
value_to_update = int(input("변경하고자 하는 새 값을 입력하세요: "))
if 0 <= r_idx < rows and 0 <= c_idx < cols:
matrix[r_idx][c_idx] = value_to_update
print(f"matrix[{r_idx}][{c_idx}] 값이 {value_to_update}(으)로 변경되었습니다.")
else:
print("잘못된 인덱스입니다. (IndexError)")
1-9-5. 2차원 배열 패턴 출력
(1) 가로 지그재그 패턴
1 2 3 4 # 짝수 행 (왼쪽에서 오른쪽으로 수 증가)
8 7 6 5 # 홀수 행 (오른쪽에서 왼쪽으로 수 증가 or 왼쪽에서 오른쪽으로 수 감소)
9 10 11 12 # 짝수 행
16 15 14 13
- 각 행에서 출력해야 할 내용을 배열에 채운 후,
짝수행에서는 정방향으로,홀수행에서는 역방향으로 수 출력- 기본 숫자 배열 생성: 정사각형 크기 n에 따라 연속된 숫자들을 행렬 형태로 생성
- 짝수 행과 홀수 행 구분: 인덱스 활용
- 홀수 행의
순서 뒤집기
n = 4 # 정사각형의 크기
cnt = 1 # 수 시작값
for i in range(n):
row = []
# 1단계: 기본 숫자 배열 생성하기
for j in range(n): # 각 행(i)마다 n개의 숫자를 순차적으로 row 리스트에 추가
row.append(cnt)
cnt += 1
# 2단계: 짝수 행과 홀수 행 구분하기
if i % 2 != 0:
# 3단계: 홀수 행의 숫자 순서 뒤집어서 출력하기
for j in range(n - 1, -1, -1):
print(row[j], end=" ")
else:
# 짝수 행이라면 그대로 출력하기
for j in range(n):
print(row[j], end=" ")
print()
(2) 세로 지그재그
열 중심 패턴
1 8 9 16
2 7 10 15
3 6 11 14
4 5 12 13
# 짝수 열 (위에서 아래로 수 증가)
# 홀수 열 (아래에서 위로 수 증가 or 위에서 아래로 수 감소)
- 우선 2차원 배열에 정답을 모두 채운 뒤, 그 배열을 출력하는 방식으로 해결
- 2차원 배열 만들기: n x n 크기인 2차원 배열 생성
- 열 순서로 순회: 행 기준이 아닌 열 기준으로 순회하는 코드 작성
- 짝수 열과 홀수 열 구분하여 값 채우기: 짝수 열이면 위->아래 방향으로, 홀수 열은 아래->위 방향으로 값 채우기
- 출력
# 예제 1
n = 4 # 정사각형의 크기
cnt = 1 # 수의 시작 값
arr = [[0 for i in range(n)] for i in range(n)] # 1단계: n x n 사이즈의 2차원 배열 만들기
# 2단계: 열 순서로 순회하기
for i in range(n):
# i는 i번째 행이 아닌 i번째 '열'을 의미합니다.
# 3단계: 짝수 열과 홀수 열 구분하여 값 채우기
if i % 2 != 0: # 홀수 열은 아래->위로 값 채우기
for j in range(n - 1, -1, -1):
arr[j][i] = cnt # 위->아래 방향은 arr[i][?] 이지만, 왼쪽->오른쪽 방향은 arr[?][i] 형태
cnt += 1
else: # 짝수 열은 위->아래 값 채우기
for j in range(n):
arr[j][i] = cnt
cnt += 1
# 4단계: 출력하기 (위->아래 + 같은 행에서는 왼->오른쪽으로 출력)
for i in range(n):
for j in range(n):
print(arr[i][j], end=" ")
print()
1-9-6. 문제
(1) 연습
# 예시 1
array1 = [[1, 2, 3], [4, 5, 6]]
array2 = [[1 for j in range(3)] for i in range(2)] # [[1, 1, 1], [1, 1, 1]]
for i in range(2):
for j in range(3):
print(array1[i][j] + array2[i][j], end=' ')
print()
# 출력
# 2 3 4
# 5 6 7
(2) 배열의 값을 3배로
- 문제: 3행 3열의 배열이 주어지면 배열의 모든 원소를 3배로 만든 뒤, 배열을 그대로 출력
- 입력: 3행 3열의 배열이 입력으로 주어지고, 첫 번째 줄부터 세 번째 줄까지 각 배열의 값이 공백을 두고 입력으로 주어짐
- 출력: 연산이 완료된 후, 3행 3열의 배열을 입출력 예제와 같이 출력
- 예제:
# 입력
3 2 3
1 3 1
1 1 1
# 출력
9 6 9
3 9 3
3 3 3
- 풀이:
rows = 3
cols = 3
matrix = [list(map(int, input().split())) for _ in range(rows)]
for row in matrix:
for col in range(cols):
row[col] *= 3
print(*row)
(3) 두 배열의 곱
- 문제: 3행 3열의 배열 두 개가 주어지면 두 배열의 같은 위치에 있는 수의 곱 출력
- 입력: 3행 3열의 배열 두 개가 줄 간격을 사이에 두고 주어짐
- 출력: 주어진 두 배열의 곱을 3행 3열의 배열로 입출력 예제와 같이 출력
- 예제:
# 입력
1 2 3
4 5 6
7 8 9
# 출력
2 6 12
5 6 7
8 9 10
- 풀이:
rows = cols = 3 # A = B = 값 구조를 사용하면, 컴퓨터는 값을 딱 한 번만 만든 뒤 두 변수를 그 동일한 메모리 주소에 같이 붙여버려서 서로 다른 두 개의 배열이 독립적으로 존재하는 것이 아니라, 하나의 배열을 두 이름이 공유하는 상태가 됨 (한쪽을 수정하면 다른 한쪽도 똑같이 바뀜)
matrix1 = [list(map(int, input().split())) for _ in range(rows)]
input() # '빈 줄' 한 칸 읽고 버리기 (빈 줄 건너뛰기)
matrix2 = [list(map(int, input().split())) for _ in range(rows)]
for i in range(rows):
for j in range(cols):
print(matrix1[i][j] * matrix2[i][j], end=" ")
print()
(4) 특정 원소들의 합

- 문제: 4 x 4 크기 격자에 정수가 하나씩 주어져 있다. 이 정수들 중 다음 그림에서 색칠된 칸들에 해당하는 정수 합을 2차원 배열로 구하기
- 입력: 첫 번째 줄부터 4개의 줄에 걸쳐, 한 줄에 4개씩 정수가 공백을 두고 주어짐
- 출력: 첫 번째 줄에 색칠된 칸에 해당하는 정수들의 합 출력
- 예제
# 입력
3 3 54 5
2 6 7 81
3 31 2 1
95 5 7 1
# 출력
155
- 풀이:
# 풀이 1
n = 4
matrix = [list(map(int, input().split())) for _ in range(n)]
total = 0
cnt = 1
for row in matrix:
total += sum(row[:cnt])
cnt += 1
print(total)
# 풀이 2
matrix = [list(map(int, input().split())) for _ in range(4)]
total = 0
for i in range(4):
for j in range(4):
if j <= i:
total += matrix[i][j]
print(total)
1-10. 퀴즈
1-10-1. 제곱하여 출력하기
(1) 문제: N개의 원소가 주어질 때, 각 원소에 제곱하여 출력하기 (2) 입력: 첫 번째 줄에 원소의 개수를 나타내는 N이, 두 번째 줄에는 N개의 원소가 공백을 사이에 두고 주어짐 (3) 출력: 첫 번째 줄에 N개의 원소에 각각 제곱한 결과를 공백을 사이에 두고 입력받은 순서대로 출력 (4) 예제:
# 입력
3
1 8 5
# 출력
1 64 25
(5) 풀이:
N = int(input())
# 풀이1
nums = map(int, input().split())
for num in nums:
print(num ** 2, end=" ")
# 풀이2
print(*[num ** 2 for num in map(int, input().split())])
1-10-2. 일의 자리 배열
(1) 문제: 10 미만의 정수 두 개가 주어지면 순서대로 첫 번재, 두 번째 항으로 설정한 후 세 번째 항부터는 전전항과 전항의 합을 구하여 그 합의 1의 자리로 채워서 차례로 10개를 출력 (2) 입력: 첫 번재 줄에 첫째항, 둘째항이 공백을 사이에 두고 주어짐. (3) 출력: 첫 번재 줄에 숫자들을 공백을 사이에 두고 출력 (4) 예제:
# 입력
2 5
# 출력
2 5 7 2 9 1 0 1 1 2
(5) 풀이:
num1, num2 = map(int, input().split())
for _ in range(5):
print(num1, num2, end=" ")
num1, num2 = (num1 + num2) % 10, (num1 + num2 * 2) % 10
1-10-3. 상하로 반복하며 출력
(1) 문제: 주어지는 정수 N 값에 따라 1에서 N까지의 정수들을 상하로 반복하며 출력하기 (2) 입력: 첫 번째 줄에 N이 주어짐 (3) 출력: N 값에 따른 숫자들을 입출력 예제와 같이 출력 (4) 예제:
# 입력
4
# 출력
1414
2323
3232
4141
(5) 풀이:
N = int(input())
for i in range(N):
for j in range(N):
if j % 2 == 0:
print(i + 1, end="")
else:
print(N - i, end="")
print()
[코드트리 추천 링크] https://www.codetree.ai/ko/trail-info?referralCode=th2gr22n
댓글 0
아직 댓글이 없습니다.