파이썬에서 여러 개의 데이터를 담는 핵심 데이터 타입 4가지를 비교하고 정리한 내용입니다.
| 타입 | 기호 | 순서 | 중복 허용 | 가변성 (Mutable) |
|---|---|---|---|---|
| list | [ ] | 있음 | 허용 | 수정 가능 |
| tuple | ( ) | 있음 | 허용 | 수정 불가능 |
| set | { } | 없음 | 허용 안 함 | 수정 가능 |
| dict | {K:V} | 있음* | Key 중복 안 함 | 수정 가능 |
*참고:
dict는 Python 3.7부터 Key 저장 순서가 유지됩니다.
[ ]가장 유연하게 사용할 수 있는 데이터 타입입니다.
[ ] 대괄호로 생성하며, 원소는 콤마(,)로 구분합니다.0부터 시작합니다.-1은 마지막 원소를 의미합니다.[:]: [시작:끝:증감] 형식을 사용하여 특정 범위를 추출합니다.인덱싱 예시
colors = ['red', 'orange', 'blue', 'green', 'white', 'black']
colors[0:3] # 0 부터 3 전까지 slice
colors[:2] # 처음부터 2 전까지 slice
colors[2:] # 2부터 끝까지 slice
colors[:] # 전체
colors[1:10] # 1부터 5까지만 출력
colors[10:100] # 오류아니고, 빈 리스트만 출력
colors[1:6:2] # step 건너띄는 값.
colors[5:0:-1] # 5부터 0 전까지 -1 step
.append(): 리스트 끝에 원소 추가 (원본 직접 변경), append의 결과값(리턴값)은 Nonelen(): 원소 개수 확인.sort(): 오름차순 정렬 / .sort(reverse=True): 내림차순 정렬list + list: 리스트 연결 / list * n: 리스트 반복리스트 선언 예시
animals = ['dog', 'cat', 'bird', 'fish',]
animals = [
'dog',
'cat',
'bird',
'fish',
] #오류 아님
.sort() vs sorted()함수
# 1. sort()
animals = ['dog', 'cat', 'bird', 'fish',]
animals.sort()
animals.sort() #['cat', 'cow', 'dog', 'fish', 'mouse'] 오름차순 정렬로 바뀜(원본변화)
# 2. sorted()
colors=['red', 'orange', 'blue', 'green', 'white', 'black']
sorted(colors) #['black', 'blue', 'green', 'orange', 'red', 'white'] 오름차순 정렬로 출력됨
colors # 원본변화 없다! ['red', 'orange', 'blue', 'green', 'white', 'black']
# sorted는 원본 변화 없이 출력만 바꿔서 나옴.
( )데이터를 안전하게 보관하고 싶을 때 사용하며, 한 번 만들면 수정이 불가능합니다.
fruits = ('apple', 'banana', 'apple', 'kiwi')
fruits[0] # apple
# fruits[0] = 'mango' # 에러! tuple 은 immutable 하다!
animals = ("dog",))수학의 집합 개념과 유사하며 중복을 허용하지 않습니다.
순서 없음 : 인덱스 번호로 접근할 수 없습니다.
중복 제거 : 중복된 값을 넣어도 하나만 저장됩니다.
빈 세트 생성 : 반드시 set() 함수를 사용해야 합니다. ({ }는 딕셔너리로 인식)
방법1
animals = {"dog", "cat", "dog", "bird"}
animals # {'bird', 'cat', 'dog'}
a = set()
a.add('dog')
a #{'dog'}
키(Key)와 값(Value)의 쌍으로 데이터를 관리합니다.
Key: 중복될 수 없으며 해시 가능한(Immutable) 타입만 가능합니다.
Value: 어떤 타입의 데이터든 저장할 수 있습니다.
# 딕셔너리 선언
#방법1.
student = {"name":"손오공", "email":"son@mail.com"}
student # {'name': '손오공', 'email': 'son@mail.com'}
#방법2. {}
my_dict = {}
#방법3. dict()
my_dict = dict()
#방법4. dict(,)
my_dict = dict(host='127.0.0.1', port=3306)
#방법5. dict([(),()])
my_dict = dict([('host', '128.0.11.5'), ('port', 8080)])
# key-value 쌍의 개수.
len(student) # 2
# 특정 키(Key)에 연결된 값(Value)을 가져오는 방법
# 1. 인덱싱
student["name"] #손오공 /키 값이 없으면 error 발생.
# 2. get() 방식
student.get("name") #손오공 /키 값이 없어도 에러 발생안함(None 반환).
dict.get(key, default): 키가 없어도 에러 없이 기본값을 반환합니다.
dict.update({k: v}): 해당 키의 값을 수정하거나, 없으면 새로 추가합니다.
del(dict[key]): 특정 키-값 쌍을 삭제합니다.
# 기존 key 값에 대입 (수정)
student['name'] = '홍길동'
student #{'name': '홍길동', 'email': 'son@mail.com'}
# 기존에 없던 key 값에 대입 (새로운 k-v 추가)
student['address'] = '서울시'
student #{'name': '홍길동', 'email': 'son@mail.com', 'address': '서울시'}
# 삭제
del(student['email'])
student #{'name': '홍길동', 'address': '서울시'}
# dict.update() 수정
student.update({'name':'도라에몽'})
student #{'name': '도라에몽', 'address': '서울시'}
# dict.update() 추가
student.update({'age': 13})
student #{'name': '도라에몽', 'address': '서울시', 'age': 13}
구성 확인:
keys(): 키 목록 추출
values(): 값 목록 추출
items(): (키, 값) 튜플 쌍 목록 추출
student = {
"name":"최현진",
"email":"choi@mail.com",
"age": 23,
"addr" : "서울"
}
1. keys()
student.keys() # key 들로만 구성된 iterable 객체 리턴됨.
# dict_keys(['name', 'email', 'age', 'addr'])
list(student.keys() )
# ['name', 'email', 'age', 'addr']
2. values()
student.values()
# dict_values(['최현진', 'choi@mail.com', 23, '서울'])
3. items()
student.items() # (key, value) 튜플 ... 들로 구성된 iterbale 객체 리턴함.
# dict_items([('name', '최현진'), ('email', 'choi@mail.com'), ('age', 23), ('addr', '서울')])
my_dict = {
1: 'haha',
2: 'hoho',
2: 'HeHe', # key 는 중복 불가!
# [10, 20]: 3.14, # list, set, dict 등은 dict 의 key 로 사용 불가!
"two": {
3.14: "pi",
"pi": 3.14,
},
False: [10, 20, 30],
(1, 2): 'nice',
}
my_dict[1] # haha
my_dict['two'] # {3.14: 'pi', 'pi': 3.14}
my_dict['two'][3.14] # pi
my_dict[False] # [10, 20, 30]
my_dict[(1, 2)] # nice
my_str = "hello python"
my_str[0] # h / index 가능!
# my_str[0] = 'Y' # str 은 immutable(불변) 하다!
# 변경할 수 없다.!
animals=['mouse', 'fish', 'dog', 'cow', 'cat']
"--".join(animals) # mouse--fish--dog--cow--cat
my_str = "Hello Python 2026"
# split() 에 매개변수 없이 사용하면 공백 기준으로 문자열 쪼개짐 => list 리턴
# 공백 : 띄어쓰기, 탭, 줄바꿈...
my_str.split() #['Hello', 'Python', '2026']
my_str="2026-01-20"
list(my_str) #['2', '0', '2', '6', '-', '0', '1', '-', '2', '0']
# 2차원 리스트. -> 원소가 1차원 리스트
data = [
[1, 2, 3],
[10, 20, 30],
[40, 50, 60],
]
data # [[1, 2, 3], [10, 20, 30], [40, 50, 60]]
len(data) # 3
data[0] # [1, 2, 3]
data[1][0] # [][] 인덱스를 2개 사용하여 원소 사용. 2차원 리스트
----------------------------------------------------------
# data --> 2차원 list
# data[0] --> 1차원 list
# data[0][0] --> 0차원. scalar 값.
# ※ 인덱싱을 한다는 것은 차원 -1 축소 발생
# 2차원 리스트의 원소는 1차원 리스트
# 3.. 원소는 2차원..
# 99차원... 원소는 98...
# n 차원 리스트의 원소는 n-1 차원 리스트
# 사각형의 가로, 세로값
rec = [100, 200]
width = rec[0]
height = rec[1] # 이렇게 값을 옮기지 말고,
width, height = rec # 변수들의 tuple 에 iterable 을 대입.
a, b, c = 10, 20, 30
a, b, c # (10, 20, 30)
None 을 리턴하는 데이터 조작함수는 원본을 변경하는 함수인 경우가 많다.