1. Introduction
파이썬을 배우고 나서 리스트를 잘 다루지 못한다면 '허당' 천재님으로 놀림을 당할 수 있을 정도로 리스트는 아주 중요한 부분입니다. 그런데 아시려나, 천재는 1%만 하늘에서, 나머지 99%는 노력으로 이루어진다는 것을. (이 포스팅은 아직 편집 중입니다. )
리스트는 여러 개의 변수를 만들 때 편리합니다. 변수에 어떤 값을 저장하고 잠시 기억하게 하는 용도로 사용할 때, 변수의 갯수가 몇 개 안 될 때에는 문제가 없으나, 변수의 갯수가 수 백개, 수 천개 혹은 그 이상이 되면 변수의 이름을 정하는 것도 매우 어려운 문제가 됩니다. 리스트는 이럴 때 사용하면 아주 좋습니다.
(Doc. v1.0.6)
2. Code
===============
핵심 코드 1
===============
fish = [ "고등어", "참치", "꽁치", "넙치" ]
print(fish)
print(fish[2])
price = [ [ "고등어", 4000], [ "참치", 7000 ], [ "꽁치", 3000 ], [ "넙치", 5000 ] ]
print( price)
print(price[3])
print(price[1][1])
===============
핵심 코드 2
===============
# 반복문을 이용해서 리스트 구성 요소 전부를 출력하는 방법.
cList = [ 'Hello', 'James', '안녕', '월리' ]
for i in range(4):
print(cList[i])
# 이때 i는 0, 1, 2, 3까지 값을 가지게 됩니다.
# range(4)의 뜻은 0부터 4 앞까지 그러니까 3까지만 포함한다는 뜻입니다. 0, 1, 2, 3.
# 4는 포함되지 않습니다. 중요 사항!!
===============
핵심 코드 3
===============
# 그런데 리스트의 구성 요소가 엄청나게 큰 숫자가 된다면, 리스트 요소의 갯수를 세는 것은 사람이 하기 힘듭니다.
# len() 함수를 사용해서 처리해야 합니다. dList는 어마어마한 길이의 리스트입니다. 지구인 전부의 이름을 저장하고 있습니다.
dList = [ '김밍구', '땡72', '찡찡이', '이선후' ]
for i in range(len(dList)):
print(cList[i])
3. Result
짧은 코드이므로 직접 입력해서 실행 결과를 확인해 봅니다.
4. Notes
리스트도 하나의 변수처럼 이름이 필요합니다. 여기서는 aList라는 이름을 붙여서 사용하겠습니다. 리스트 변수를 만드는 방법 몇 가지를 보겠습니다.
# 텅 빈 리스트 만들기
aList = []
# 리스트를 만들 때, 빈 칸 여러 개는 의미가 없습니다.
>>> f = [ ]
>>> f
[]
만들어질 때부터 데이터를 가지고 있는 리스트를 만들려면 다음과 같이 합니다. .
bList =[ 1, 2, 3 ]
정수값 데이터 3개. bList에 저장되어 있는 데이터는 1, 2, 3이며 1, 2, 3은 리스트의 원소, 요소element, 혹은 구성 요소라고 합니다.
문자열을 원소/요소, 구성 요소(=데이터)로 가지고 있는 리스트도 만들 수 있습니다. 다음과 같이 하면 됩니다.
stringList = [ "이채홍", "뺀질이", "똘똘이" ]
문자열은 인용 부호(=따옴표, '...', 또는 "...")가 반드시 필요합니다.
인용 부호는 작은 따옴표나 큰 따옴표 모두 허용됩니다. 다만 짝은 맞추어야 합니다.
문자열이 1 글자로만 구성되더라도 문자열은 문자열입니다.
ch1string = "A"
# "A"는 문자열입니다.
# 문자열 데이터를 가지고 있는 리스트 만들기.
cList = ['Hello', 'James', '안녕', '월리' ]
위 리스트 변수를 다양하게 출력하는 방법은 다음과 같습니다.
# 리스트 전체 출력하기.
>>> aList =[]
>>> aList
또는
>>> print(aList)
# 리스트의 특정 요소만 출력하려면 다음과 같이 합니다. 리스트의 구성 요소 하나 하나를 가리킬 때 인덱스 번호를 사용합니다. 0부터 시작합니다. 맨 처음 요소가 0번, 그 다음 요소가 1 번. 이런 식으로 1씩 증가합니다.
>>> cList = ['Hello', 'James', '안녕', '월리' ]
>>> cList[1]
'James'
>>> print(cList[2])
'안녕'
>>> print(cList[0])
'Hello'
■ len() 함수
len()함수는 리스트의 길이를 알아냅니다.
len(dList)
인덱스 번호가 아니라 구성 요소의 실제 갯수를 뜻하기 때문에 1, 2, 3, 4. 그래서 4. 이것을 그대로 range() 함수에 넣으면 range(4)와 같은 효과를 가집니다.
리스트의 구성 요소가 엄청나게 큰 숫자가 된다면, 리스트 요소의 갯수를 세는 것은 사람이 하기 힘듭니다. len() 함수를 사용해서 처리하는 것이 좋습니다. dList는 천만 명의 이름 정보를 저장하고 있는 어마어마한 길이의 리스트라고 가정합니다.
dList = [ 'Hello', 'James', '안녕', '월리' ]
for i in range(len(dList)):
print(cList[i])
# 출력 결과 :
Hello
James
안녕
월리
▶ ▶ 참고 : 파이썬의 리스트에 구성 요소를 최대 몇 개까지 저장할 수 있는가?
파이썬 리스트의 구성 요소 갯수의 최대 제한
파이썬 리스트는 이론적으로 매우 많은 요소를 저장할 수 있지만, 실제로는 사용하는 시스템의 메모리(RAM)와 운영체제에 따라 제한됩니다.
✔ 최대 저장 가능 요소 수
파이썬 리스트의 크기는 sys 모듈의 sys.maxsize 값을 참고하면 대략적인 한계를 알 수 있습니다. 일반적으로 sys.maxsize는 9,223,372,036,854,775,807 (약 9백경) 정도로 매우 큰 숫자지만, 실제로는 사용 가능한 메모리에 따라 리스트 크기가 제한됩니다.
✔ 실제 제한 요소
- RAM 크기: 리스트에 저장된 요소가 많아질수록 메모리 사용량이 증가합니다.
- 운영체제 및 파이썬 구현: 일부 시스템에서는 특정 크기 이상의 리스트를 만들면 메모리 부족 오류가 발생할 수 있습니다.
- 요소의 데이터 타입: 리스트에 저장하는 데이터의 크기에 따라 더 많은 요소를 저장할 수도, 적게 저장할 수도 있습니다.
따라서 이론적으로는 엄청난 수의 요소를 저장할 수 있지만, 실제로는 시스템의 메모리와 환경에 따라 제한이 생깁니다.
.
.
■ 빈 리스트에 대한 주의 사항
Python 3.10.11에서 테스트했습니다.
1) 먼저 빈 리스트를 만듭니다. 대괄호 사이에는 아무것도 없습니다.
>>> aList = []
2) aList라고 입력하고 엔터를 치면 그 내용이 출력됩니다. 여기서는 빈 리스트 외관 모양만 출력됩니다.
>>> aList
[]
3) 빈 리스트도 리스트이므로 첫 번째 요소를 나타내는 0번 인덱스 번호를 이용해서 데이터를 입력해 봅니다.
>>> aList[0] = 1
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: list assignment index out of range
에러 메시지가 출력됩니다. 에러 내용은 인덱스에러입니다. 리스트 요소에 값을 할당할 때 사용된 인덱스 번호가 유효한 범위를 벗어났다는 내용입니다. (IndexError: list assignment index out of range)
즉 aList[0] = 1에서 [0] 이 부분이 틀렸다는 말입니다. 빈 리스트를 만들고 곧 바로 값을 할당할 수 없다는 뜻입니다. 0번 인덱스라고 해도 안 됩니다.
그럼 빈 리스트에는 값을 어떻게 추가할까요? 이런 용도로 append()라는 함수가 준비되어 있습니다. append() 함수는 리스트의 끝에 데이터를 추가합니다. 무조건 끝에 추가합니다.
그런데 빈 리스트라면 텅 비어있기 때문에 맨 처음 자리도 비어있습니다. 첫 자리가 곧 끝 자리입니다. 그래서 예외적으로 위치상 맨 처음에 추가됩니다. 여기서 데이터가 맨 처음에 추가되었지만, append() 함수 입장에서는 리스트의 끝에 추가한 것이 맞습니다. ^.^;
실제 사용 예제부터 살펴보겠습니다. 표준 Python Shell이나 Thonny IDE의 하단 Shell(추천)에서 실습해 보세요.
# 먼저 빈 리스트 만들기, 그리고 확인.
>>> aList = []
>>> aList
[]
# append() 함수를 사용해서 값을 추가하기, 그리고 확인.
>>> aList.append(1)
>>> aList
[1]
# 0번 인덱스의 내용을 확인해 봅니다.
>>> aList[0]
1
정상적으로 데이터가 추가되었습니다. 0번 인덱스 번호로도 확인해 보면 값이 정확하게 저장되어 있습니다.
리스트의 맨 처음 요소의 인덱스 번호는 0번입니다. 이 방식으로 정상으로 작동되는 것을 확인했습니다.
■ 참고 사항
1) aList = [] # 빈 리스트 만들기 가능. 이때, 리스트 요소 추가는 append() 함수를 사용함.
2) 리스트 요소 길이(= 갯수)는 len() 함수로 알아냄. 독립 함수.
>>> len(aList)
3) 인덱싱은 리스트에 요소 추가나 리스트 초기화 이후에 가능합니다. 그 전에는 인덱싱 불가. 당연한 말이지만.
4) Python에서 인덱스 번호는 0번부터 시작한다는 것에 주의해야 합니다.
■ 리스트 객체의 내장 메서드 함수들 :
파이썬의 리스트 객체에는 다양한 내장 메서드가 있습니다. 데이터를 추가, 삭제, 정렬하고 다양한 조작을 할 수 있도록 도와줍니다. 대표적인 리스트 메서드를 아래에 정리합니다.
메서드 | 설명 | 사용 예제 |
append(item) | 리스트 끝에 요소 추가 | lst.append(5) |
extend(iterable) | 다른 iterable(리스트, 튜플 등)의 요소를 추가 | lst.extend([6, 7]) |
insert(index, item) | 특정 위치에 요소 삽입 | lst.insert(2, 'hello') |
remove(item) | 특정 값의 첫 번째 등장 요소 삭제 | lst.remove(3) |
pop(index) | 특정 위치 요소 제거 및 반환 (기본값: 마지막) | lst.pop(1) |
clear() | 모든 요소 제거 | lst.clear() |
index(item) | 특정 값의 첫 번째 인덱스 반환 | lst.index(2) |
count(item) | 특정 값의 개수 반환 | lst.count(5) |
sort(reverse=False, key=None) | 리스트 정렬 (기본적으로 오름차순) | lst.sort() |
reverse() | 리스트 요소 순서 뒤집기 | lst.reverse() |
copy() | 리스트의 얕은 복사본 생성 | new_lst = lst.copy() |
■ update 1. append() vs. insert() 비교 테스트
위 목록 중에서 일단 많이 사용하는 핵심적인 것부터 아래에서 좀 더 자세하게 살펴보겠습니다.
insert() 메서드는 리스트의 특정 위치에 요소를 삽입할 때 사용됩니다.
구문은 다음과 같습니다:
list.insert(index, element)
- index: 요소를 삽입할 위치 (0부터 시작)
- element: 삽입할 값
간단한 예제를 하나 봅니다.
fruits = ["apple", "banana", "cherry"]
fruits.insert(1, "orange") # 인덱스 1 위치에 "orange" 삽입
print(fruits)
출력 결과:
['apple', 'orange', 'banana', 'cherry']
즉, insert()를 사용하면 기존 리스트의 구조를 변경하지 않고 원하는 위치에 값을 추가할 수 있습니다. 리스트의 끝에 요소를 추가하고 싶다면 append()를 사용합니다!
■ update 2. 추가 위치
다음 코드 상황을 가정합니다.
aList = []
aList.insert(1, "A")
빈 리스트를 만들고 요소를 추가하려고 합니다.
insert(index, value) 메서드는 유효한 인덱스 또는 리스트의 끝에 값을 삽입하는 방식으로 동작합니다.
- 리스트의 인덱스 범위는 0부터 시작하지만, 현재 리스트가 비어 있기 때문에 유효한 인덱스는 0뿐입니다.
- 만약 insert()의 인덱스가 리스트 길이보다 크면, 자동으로 리스트 끝에 요소가 삽입됩니다.
■ update 3. 예상하지 못한 결과
퀴즈 1.
아래 코드와 같을 때, 1번 인덱스에"A"가 저장되는가? 아니면 0번 인덱스에 저장되는가? 그 결과와 이유를 설명하세요.
aList = []
aList.insert(1, "A")
풀이 :
빈 리스트는 0번 인덱스만 유효합니다. 따라서 aList.insert(1, "A")에서 인덱스 1은 리스트의 길이를 초과하므로 "A"는 자동으로 0번 인덱스에 삽입됩니다. "A"는 리스트의 첫 번째 위치(인덱스 0)에 저장됩니다. 즉, 빈 리스트에서는 항상 insert()의 인덱스가 리스트 길이를 초과하면 요소는 리스트의 끝에 추가됩니다!
■ update 4. 요소의 갯수
insert()는 요소의 갯수를 늘리는가? 네. 맞습니다. insert() 메서드는 리스트의 크기를 증가시킵니다. 즉, 기존 리스트에서 특정 위치에 요소를 삽입하면, 기존 리스트 요소들은 전부 보존되고 insert() 요소가 새로 생겨나기 때문에 전체 요소의 개수는 늘어나게 됩니다. 다만 기존 요소들은 추가되는 요소 때문에 지정 위치부터 인덱스 번호가 1씩 뒤로 밀리게 됩니다. 따라서 aList.append()로 1000개를 추가한 상황에서 어떤 위치에 추가를 하든 aList.insert()를 1000개 하면 요소의 수는 2000으로 늘어납니다.
예:
aList = ["X", "Y"]
print(len(aList)) # 2
aList.insert(1, "A") # 인덱스 1에 "A" 삽입
print(len(aList)) # 3
print(aList) # 출력: ['X', 'A', 'Y']
insert() 실행 과정:
1) "A"를 인덱스 1에 삽입
2) 기존 요소 "Y"는 한 칸 오른쪽으로 밀림 3) 리스트의 크기가 2 → 3으로 증가
◈ 요약: insert()를 사용하면 리스트의 요소의 갯수가 늘어나고, 기존 값들은 자동으로 오른쪽으로 이동합니다. insert()의 인덱스 위치가 리스트의 끝을 의미하면, insert()는 append()와 같이 리스트의 끝에 추가됩니다.
■ update 5. 연습 1. 홀수 채우기 - append() 방식
# 빈 리스트 생성
aList = []
# 100개의 요소 추가 (append 사용)
for i in range(100):
aList.append(2 * i + 1) # 1, 3, 5, 7, ... (홀수만 추가), i를 활용.
# 리스트 출력
print(aList)
설명:
- 빈 리스트 aList를 생성합니다.
- for 반복문을 100번 실행하여 append()로 홀수를 추가합니다.
- 2 * i + 1을 사용하여 1부터 시작하는 연속된 홀수를 생성합니다.
- 예: i=0일 때 1, i=1일 때 3, i=2일 때 5, ...
- 마지막으로 리스트를 출력하면 1부터 199까지의 홀수가 포함된 리스트가 생성됩니다.
실행 결과 :
[1, 3, 5, 7, 9, ..., 197, 199]
이렇게 하면 원하는 홀수 리스트를 쉽게 만들 수 있습니다.
■ update 6. 연습 2. 홀수 채우기 - insert() 방식
insert()를 사용하여 같은 결과를 만들 수 있습니다. 하지만 append()와 다르게 insert()는 지정된 위치에 값을 삽입하는 방식이므로, 매번 리스트의 끝에 추가하려면 insert()의 인덱스를 조정해야 합니다.
예제 코드:
aList = [] # 100개의 홀수 값을 insert()로 추가
for i in range(100):
aList.insert(len(aList), 2 * i + 1) # 리스트의 끝에 삽입
print(aList)
코드 설명:
1) insert(len(aList), value)를 사용하여 리스트의 마지막 위치에 값을 삽입합니다. 리스트의 크기를 계산합니다. 리스트의 요소의 크기를 계산합니다. 이 크기값을 인덱스 번호로 사용하므로 리스트의 끝을 뜻하게 됩니다.
2) 2 * i + 1을 사용하여 1부터 시작하는 홀수를 생성합니다.
3) insert()는 기존 리스트의 요소를 밀어내지 않고 항상 끝에 추가되므로, append()와 같은 결과를 얻을 수 있습니다.
■ update 3. 예상하지 못한 결과
퀴즈 1.
아래 코드와 같을 때, 1번 인덱스에"A"가 저장되는가? 아니면 0번 인덱스에 저장되는가? 그 결과와 이유를 설명하세요.
aList = []
aList.insert(1, "A")
풀이 :
빈 리스트는 0번 인덱스만 유효합니다. 따라서 aList.insert(1, "A")에서 인덱스 1은 리스트의 길이를 초과하므로 "A"는 자동으로 0번 인덱스에 삽입됩니다. "A"는 리스트의 첫 번째 위치(인덱스 0)에 저장됩니다. 즉, 빈 리스트에서는 항상 insert()의 인덱스가 리스트 길이를 초과하면 요소는 리스트의 끝에 추가됩니다!
■ update 4. 요소의 갯수
insert()는 요소의 갯수를 늘리는가? 네. 맞습니다. insert() 메서드는 리스트의 크기를 증가시킵니다. 즉, 기존 리스트에서 특정 위치에 요소를 삽입하면, 기존 리스트 요소들은 전부 보존되고 insert() 요소가 새로 생겨나기 때문에 전체 요소의 개수는 늘어나게 됩니다. 다만 기존 요소들은 추가되는 요소 때문에 지정 위치부터 인덱스 번호가 1씩 뒤로 밀리게 됩니다. 따라서 aList.append()로 1000개를 추가한 상황에서 어떤 위치에 추가를 하든 aList.insert()를 1000개 하면 요소의 수는 2000으로 늘어납니다.
예:
aList = ["X", "Y"]
print(len(aList)) # 2
aList.insert(1, "A") # 인덱스 1에 "A" 삽입
print(len(aList)) # 3
print(aList) # 출력: ['X', 'A', 'Y']
insert() 실행 과정:
1) "A"를 인덱스 1에 삽입
2) 기존 요소 "Y"는 한 칸 오른쪽으로 밀림 3) 리스트의 크기가 2 → 3으로 증가
◈ 요약: insert()를 사용하면 리스트의 요소의 갯수가 늘어나고, 기존 값들은 자동으로 오른쪽으로 이동합니다. insert()의 인덱스 위치가 리스트의 끝을 의미하면, insert()는 append()와 같이 리스트의 끝에 추가됩니다.
■ update 5. 연습 1. 홀수 채우기 - append() 방식
# 빈 리스트 생성
aList = []
# 100개의 요소 추가 (append 사용)
for i in range(100):
aList.append(2 * i + 1) # 1, 3, 5, 7, ... (홀수만 추가), i를 활용.
# 리스트 출력
print(aList)
설명:
- append()는 리스트 끝에 추가하는 데 최적화되어 있으며 속도가 더 빠릅니다.
- insert()는 내부적으로 요소 이동이 발생할 수 있어 큰 리스트에서는 성능이 떨어질 수 있습니다.
결론적으로, insert()를 사용할 수도 있지만 이런 경우에는 append()가 더 적절한 선택입니다. 상황에 적절하게 사용해야 합니다.
■ 리스트 관련 독립 함수 :
del(List) - 리스트 객체를 삭제한다. del(x), del x 이 두 방식 모두 실험해보세요. ^.^;
len(List) – 리스트의 길이(요소 개수) 반환
1) del - 파이썬의 내장 키워드로, 리스트뿐만 아니라 변수, 객체, 슬라이스 등을 삭제할 때 사용할 수 있습니다.
L = [ 1, 2, 3, 4, 5]
del L[3]
# 3번 인덱스 번호에 해당되는 요소를 삭제. 여기서는 4. 인덱스 번호는 0부터 시작함.
# del은 변수 객체를 삭제하는 용도로도 사용될 수 있음.
x = 5
del x
print(x) # 오류 발생. x는 없어졌기 때문.
del(L) 방식은 되기는 되지만 되더라도 권장되는 방식은 아니라고 합니다. del이 처음에는 키워드로 만들어져서 그렇다고 합니다. 괄호를 붙여서 del()처럼 쓰면 함수처럼 사용하는 셈이 됩니다. 키워드는 괄호가 원래 없습니다. 키워드 vs. 함수! 좀 더 다른 자료를 찾아보도록 하겠습니다. (찾으면 이 부분, 업데이트)
■ 리스트 인덱싱 :
■ 리스트 슬라이스 :
■ 응용 연습 과제
1) 랜덤 숫자를 리스트에 100개 저장하기
2) 1부터 101까지를 마운틴 넘버형으로 리스트에 저장하기
예) 1 2, 3, .... 97, 98, 99, 100, 101, 100, 99, 98, 97, ... 3, 2, 1
(⛰ 산 모양 숫자.)
5. Files
짧은 내용이라 아직은 필요 없을 듯.
6. Ref.
1) 강환수, 신용현, 《파이썬으로 배우는 누구나 코딩》홍릉출판사.
Happy Programming!
^.^;
'Programming > Python' 카테고리의 다른 글
프로세스의 실행과 종료하기 - Ex. 001 - calc.exe의 정체 (0) | 2025.05.22 |
---|---|
Processing PythonMode Ex - 002 (0) | 2025.04.29 |
Processing PythonMode Ex. 001 (0) | 2025.03.29 |
Python Intro - 003 - Input and Return Value Ex. 001 (0) | 2025.02.16 |
Tkinter Entry 위젯 - 002 : StringVar() (0) | 2025.02.16 |