강의실/컴퓨팅사고 with python

Ch10_딕셔너리,집합,파일처리 (1)

jsBae 2025. 5. 14. 23:29

Chapter10_딕셔너리, 집합, 파일처리

참고.data types(list,tuple,set,dictionary)

파이썬은 여러 가지 데이터 타입을 지원하여 다양한 종류의 데이터를 처리할 수 있습니다.

  • 정수형(int): 정수 값을 나타내는 데이터 타입입니다. 양수, 음수, 0을 포함한 모든 정수 값을 표현할 수 있습니다.
  • 부동소수점형(float): 실수 값을 나타내는 데이터 타입으로, 소수점을 가지는 수를 표현할 수 있습니다. 부동소수점 연산에는 근사치가 포함될 수 있습니다.
  • 문자열(str): 문자의 시퀀스로 텍스트 데이터를 나타내는 데이터 타입입니다. 작은 따옴표(')나 큰 따옴표(")로 감싸서 생성합니다.
  • 불리언(bool): 참(True) 또는 거짓(False) 값을 가지는 데이터 타입으로, 조건문과 논리 연산에 사용됩니다.
  • 리스트(list): 여러 값을 순차적으로 저장하는 데이터 타입입니다. 서로 다른 타입의 요소들을 포함할 수 있으며, 대괄호([])로 생성하고 각 요소는 쉼표로 구분합니다.
  • 튜플(tuple): 리스트와 유사하지만 변경할 수 없는(immutable) 데이터 타입입니다. *소괄호(())로 생성하며, *요소들은 쉼표로 구분됩니다.
  • 딕셔너리(dict): 키(key)와 값(value)의 쌍으로 데이터를 저장하는 데이터 타입입니다. 중괄호({})로 생성하며, 각 쌍은 '키: 값' 형태로 구성됩니다.
  • 세트(set): 중복되지 않은 값을 가지는 데이터 타입으로, 중괄호({})나 set() 함수로 생성합니다. 순서가 없기 때문에 인덱스로 접근할 수 없습니다.
  • ** NoneType(None)**: 값이 없음을 나타내는 데이터 타입으로, 주로 변수에 초기값을 할당하지 않거나 함수의 반환 값이 없는 경우에 사용됩니다.

이외에도 컴플렉스(complex) 타입, 바이트(bytes) 및 바이트 배열(bytearray) 등 다양한 데이터 타입이 있습니다. 파이썬은 동적 타이핑(dynamic typing) 언어로, 변수의 타입은 할당될 때 자동으로 결정됩니다.


01.딕셔너리(dictionary)

Dictionary(사전)은 파이썬에서 매우 유용한 데이터 유형 중 하나로, 키(Key)와 값(Value)으로 구성되는 자료구조입니다.

  • 사전은 키와 값의 쌍을 저장하며, 키를 통해 값을 빠르게 검색하고 관리할 수 있습니다.
  • 사전은 중괄호 {}를 사용하여 생성하며, 각 키와 값은 콜론(:)으로 구분되고, 쌍들은 쉼표로 구분됩니다.

1-1.생성 :Key – Value 쌍으로 이루어진 자료형 { : }

딕셔너리명 = {"키1":"값1", "키1":값2, …}
# 영한 사전
eng_to_kor = {
    'apple': '사과',
    'banana': '바나나',
    'cherry': '체리',
    'grape': '포도'
}
print(eng_to_kor)
print(type(eng_to_kor))
# 국가별 인구수 사전
population = {
    'Korea': 51780579,
    'USA': 331002651,
    'China': 1439323776,
    'India': 1380004385
}
#Key : 변수 또는 튜플    Value : 거의 모든 자료형 가능
b = {(1, '가'):["리","스","트"],}
b[(1,"가")]

연습1

한 사람의 인적사항을 기록할 예정이다. key 값으로는 ‘name’, ‘phone’, ‘job’, ‘address’를 가지는 딕셔너리를 생성해보자.
std_info = {
    'name': 'John Doe',
    'age': 18,
    'grade': 'A'
}
print(std_info)
{'name': 'John Doe', 'age': 18, 'grade': 'A'}

연습2

3명의 학생들이 다섯 문제의 시험을 보았다. Key로는 사람 이름을, 적어낸 5개의 답을 리스트를 값으로 하는 딕셔너리를 제작하라.

# 학생들의 답안 딕셔너리 생성
student_answers = {
    'Alice': ['A', 'B', 'C', 'D', 'E'],
    'Bob': ['B', 'C', 'D', 'E', 'A'],
    'Charlie': ['C', 'D', 'E', 'A', 'B']
}

# 학생들의 답안 출력
for student, answers in student_answers.items():
    print(f"{student}'s answers:", answers)
Alice's answers: ['A', 'B', 'C', 'D', 'E']
Bob's answers: ['B', 'C', 'D', 'E', 'A']
Charlie's answers: ['C', 'D', 'E', 'A', 'B']

02.딕셔너리 추가하기

  • 해당 키를 입력하여 변수명을 입력하면 된다.{1: 'a'} 딕셔너리에 a[2] = 'b'와 같이 입력하면 딕셔너리 a에 Key와 Value가 각각 2와 'b'인 {2: 'b'} 딕셔너리 쌍이 추가된다.
a = {1:'a'}
a[2] = 'b'
print(a)
a = {1:'a'}
a[2] = "b"
a[3] = [5,6,7]
a['pay'] = 2000
print(a)

03.딕셔너리 삭제하기

  • del 키워드 사용
  • 예:
del a[1]
a = {1:'a',2:'b', 'pay':2000, 3:[5,6,7]}
del a[1] #첫 항 삭제
print(a)

04.딕셔너리 읽기 : key를 사용해서 Value 얻기

  • 리스트나 튜플, 문자열은 요솟값을 얻고자 할 때 인덱싱이나 슬라이싱 기법 중 하나를 사용했다. *하지만 딕셔너리는 단 1가지 방법뿐이다. *
  • 그것은 바로 Key를 사용해서 Value를 구하는 방법이다.예에서 'pey'라는 Key의 Value를 얻기 위해 grade['pey']를 사용한 것처럼 어떤 Key의 Value를 얻기 위해서는 '딕셔너리_변수_이름[Key]'를 사용해야 한다.
'딕셔너리_변수_이름[Key]'
grade = {'철수': 10, '영희': 99}
grade['철수']
a = {1:'a', 2:'b'}
a[1]

먼저 a 변수에 {1: 'a', 2: 'b'} 딕셔너리를 대입하였다.
위 예에서 볼 수 있듯이 a[1]은 'a' 값을 리턴한다.

  • 여기에서 a[1]이 의미하는 것은 리스트나 튜플의 a[1]과는 전혀 다르다.
  • 딕셔너리 변수에서 [] 안의 숫자 1은 두 번째 요소를 나타내는 것이 아니라 Key에 해당하는 1을 나타낸다.
  • 앞에서도 말했듯이 딕셔너리는 리스트나 튜플에 있는 인덱싱 방법을 적용할 수 없다. 따라서 a[1]은 딕셔너리 {1: 'a', 2: 'b'}에서 Key가 1인 것의 Value인 'a'를 리턴한다. a[2] 역시 마찬가지이다.

05.딕셔너리 관련 함수

 

.keys() : key값으로 리스트 만들기

  • a.keys()는 딕셔너리 a의 Key만을 모아 dict_keys 객체를 리턴한다.
a = {1:'a',2:'b', 'pay':2000, 3:[5,6,7]}
a.keys()
dict_keys([1, 2, 'pay', 3])

.values() : value 생성

  • Key를 얻는 것과 마찬가지 방법으로 Value만 얻고 싶다면 values 함수를 사용하면 된다. values 함수를 호출하면 dict_values 객체를 리턴한다.
a.values()
dict_values(['a', 'b', 2000, [5, 6, 7]])

items():Key, Value 쌍 얻기

  • items 함수는 Key와 Value의 쌍을 튜플로 묶은 값을 dict_items 객체로 리턴한다.
a.items()
dict_items([(1, 'a'), (2, 'b'), ('pay', 2000), (3, [5, 6, 7])])

clear() : key:value 쌍 모두 지우기

  • clear 함수는 딕셔너리 안의 모든 요소를 삭제한다.빈 리스트를 [], 빈 튜플을 ()로 표현하는 것과 마찬가지로 빈 딕셔너리도 {}로 표현한다.
a.clear()

in : 해당 Key가 딕셔너리 안에 있는지 조사하기

a = {'name':'pey', 'phone':'010-9999-1234', 'birth': '1118'}
'name' in a

06.딕셔너리와 반복문

a = {1:'a',2:'b', 'pay':2000, 3:[5,6,7]}
for i in a.keys():
    print(i)
1
2
pay
3
for i in a.values():
    print(i)
a
b
2000
[5, 6, 7]

07.딕셔너리 만들 때 주의 사항

  • 딕셔너리에는 동일한 Key가 중복으로 존재할 수 없다.
    • 딕셔너리에서 Key는 고유한 값이므로 중복되는 Key 값을 설정해 놓으면 하나를 제외한 나머지 것들이 모두 무시된다는 점에 주의해야 한다.
    • 다음 예에서 볼 수 있듯이 동일한 Key가 2개 존재할 경우, 1: 'a' 쌍이 무시된다.
  • 또 1가지 주의해야 할 점은 Key에 리스트는 쓸 수 없다는 것이다. 하지만 튜플은 Key로 쓸 수 있다.
    • 딕셔너리의 Key로 쓸 수 있느냐, 없느냐는 Key가 변하는(mutable) 값인지, 변하지 않는(immutable) 값인지에 달려 있다. 리스트는 그 값이 변할 수 있기 때문에 Key로 쓸 수 없다. 다음 예처럼 리스트를 Key로 설정하면 리스트를 키 값으로 사용할 수 없다는 오류가 발생한다.
    • 단, Value에는 변하는 값이든, 변하지 않는 값이든 아무 값이나 넣을 수 있다.
#딕셔너리에는 동일한 Key가 중복으로 존재할 수 없다.
a = {1:'a',1:'b'}
a
{1: 'b'}
# Key에 리스트는 쓸 수 없다
a = {[1,2] : 'hi'}

연습문제

01

{"강감찬":"귀주대첩", "을지문덕":"살수대첩", "세종대왕":"집현전"}라는 딕셔너리를 만들고 여기에 {"서희":"강동6주"}를 추가하여라.

bigwar = {
    "강감찬":"귀주대첩",
    "을지문덕":"살수대첩",
    "세종대왕":"집현전"
}
bigwar
bigwar['서희'] = '강동6주'
print(bigwar)

02

위의 딕셔너리에서 Key가 "세종대왕"인 것의 Value를 "한글"로 수정하여라.

bigwar['세종대왕'] = '한글'
print(bigwar)

03

"을지문덕"이라는 Key가 존재하는지 확인하고 있다면 삭제하라.

if '을지문덕' in bigwar:
    del bigwar['을지문덕']

print(bigwar)

tip : 리스트를 딕셔너리로 만들기

number = [87, 98, 99]
a = dict.fromkeys(number) #dict.fromkeys(number)를 사용하여 number 리스트의 각 요소를 키로 하는 빈 딕셔너리를 생성
print(a)
#zip 함수를 사용하여 딕셔너리 생성:
keys = ["one", "two", "three"]
values = [1, 2, 3]
dictionary = dict(zip(keys, values))

print(dictionary)

연습1 (enumerate함수를 활용한 번호순 디렉토리 생성)

  1. 빈 디렉토리 생성
  2. 반복문과 enumerate(리스트명, 시작번호)을 활용
  3. 순서를 키로 사용하여 keys, values 딕션너리 추가

enumerate() : 반복 가능한 객체(예: 리스트, 튜플, 문자열 등)를 인덱스와 함께 순회할 수 있게 해주는 함수.
start 매개변수는 인덱스의 시작 번호를 지정

names = ["Alice", "Bob", "Charlie"]
name_dict = {}  # 빈 딕셔너리 생성

for index, name in enumerate(names, start=1):
    name_dict[index] = name  # 순서를 키로 사용하여 딕셔너리에 추가

print(name_dict)

연습2. 리스트의 이름의 글자수를 키값으로 하는 딕션너리 생성하기

names = ["Alice", "Bob", "Charlie"]
name_dict = {}  # 빈 딕셔너리 생성

for name in names:
    name_dict[len(name)] = name  # 리스트 요소의 길이를 값으로 활용하여 딕셔너리에 추가

print(name_dict)

딕셔너리 주요 연산

연산 예시 설명
값 조회 student["이름"] 키를 통해 값 접근
키 존재 확인 "이름" in student True / False 반환
값 수정 student["나이"] = 21 값 변경
항목 추가 student["학년"] = 3 새 키-값 추가
항목 삭제 del student["학과"] 해당 키-값 삭제
전체 키 조회 student.keys() dict_keys 객체 반환
전체 값 조회 student.values() dict_values 객체 반환
전체 쌍 조회 student.items() dict_items 객체 반환
비우기 student.clear() 모든 항목 삭제
# 딕셔너리 생성
fruit_price = {"사과": 1000, "바나나": 800, "포도": 1200}

# 값 조회
print(fruit_price["바나나"])  # 800

# 값 수정
fruit_price["사과"] = 1100

# 키 존재 여부 확인
if "포도" in fruit_price:
    print("포도는 가격 정보가 있습니다.")

# 딕셔너리 순회
for fruit, price in fruit_price.items():
    print(f"{fruit}의 가격은 {price}원입니다.")

✅ 과제 1. 나의 정보 딕셔너리 만들기

다음 정보를 담은 딕셔너리를 만들고, 각 값을 출력하시오.

  • 이름: 홍길동
  • 나이: 21
  • 전공: 소프트웨어공학
# 출력 예시:
이름: 홍길동
나이: 21
전공: 소프트웨어공학

 

728x90
반응형