코딩의 기록

따라하며 배우는 파이썬과 데이터과학 -8. 연관된 데이터를 딕셔너리로 짝을 짓자

모루우 2025. 1. 31. 19:04
728x90
반응형

1. 키와 값을 가진 딕셔너리로 자료를 저장하자

딕셔너리(dictionary): 리스트와 같이 값을 저장하는 자료구조 파이썬의 기본 자료형

값(value)과 관련된 키(key)가 있음

phone_book[key] ={value} 키-값 쌍

항목은 쉼표로 구분되어 출력 됨

 

2. 딕셔너리의 기능을 알아보자

keys() 메소드로 모든 키를 출력할 수 있음

values() 모든 값 출력 가능

items() 딕셔내리 내부의 모든 값 출력

.items()와 같이 호출하면 (키, 값) 튜플이 반환됨

contact = {"성":"홍", "이름":"길동", "직업":"어부"}

for key, value in contact.items():
    print(key,":",value)

 

이게 오랜만에 보면 이 표현식이 적응이 안되서 이해하는데 좀 걸린다 그니까 표현식이 낯설어진다는 것

역시 뭔가 아무 연관 없이 외우는게 힘든건 컴퓨터 언어도 똑같은거 같다

 

3. 딕셔너리의 다양하고 멋진 기능들을 수행하는 메소드

sorted() 함수는 키 값의 튜플 쌍을 받아 이를 정렬할 수 있음 key 매개변수로 키로 정렬할 것인지 값으로 정렬할 것인지 결정

람다 표현식: 함수의 이름이 없는 1회용 함수

key = lamda x: x[0] x를 인자로 받아 x의 첫 항목인 x[0]을 반환하는 기능을 함

항목 삭제: del

모든 항목 삭제: clear

 

4. 람다 함수 = 이름이 없는 함수

람다 표현식: 함수화된 기능만을 불러 사용하고자 할 경우

표현식 안에서 새로운 변수를 선언할 수 없음

(lamda x, y : x + y)(100, 200)

items = {"커피음료": 7, "펜": 3, "종이컵": 2, "우유": 1, "콜라": 4, "책": 5}

user = input("물건의 이름을 입력하시오: ")
print("재고 :",items[user])
items = {"커피음료": 7, "펜": 3, "종이컵": 2, "우유": 1, "콜라": 4, "책": 5}

while True:
    user = input("메뉴를 선택하시오 1) 재고조회 2) 입고 3) 출고 4) 종료 : ")

    if user == "1":
        name = input("[재고조회] 물건의 이름을 입력하시오: ")
        print("재고: ", items[name])
    elif user == "2":
        name, quant  = input("[입고] 물건의 이름과 수량을 입력하시오: ").split(" ")
        items[name] += int(quant)
        print(name,"의 재고: ", items[name])
    elif user == "3":
        name, quant = input("[출고] 물건의 이름과 수량을 입력하시오: ").split(" ")
        if int(quant) > items[name]:
            print("재고 보다 많은 수를 입력하셨습니다")
        else:
            items[name] -= int(quant)
            print(name, "의 재고: ", items[name])
    elif user == "4":
        break;
    else:
        print("1 ~ 4 번 중 입력하십시오")
dic = {}

print("사전 프로그램 시작... 종료는 q 입력")

while True:
    ch, user = input("$ ").split(" ")

    if ch == "<":
        eng, kor = user.split(":")
        dic[eng] = kor
    elif ch == ">":
        if user in dic.keys():
            print(dic[user])
        else:
            print(user, "는(은) 사전에 없습니다.")
    elif ch == "q":
        print("사전을 종료합니다.")
        break;
    else:
        print("< > q 중 하나만 입력 가능합니다.")
dic = {}

print("사전 프로그램 시작... 종료는 q 입력")

while True:
   st = input("$ ")
   command = st[0]
   if command == "<":
       st = st[1:]
       inputStr = st.split(":")
       if len(inputStr) < 2:
           print("입력 오류가 발생하였습니다.")
       else:
           dic[inputStr[0].strip()] = inputStr[1].strip() #사용자가 혹시 영어와 한글 사이에 이상한ㄷ 공백을 넣었을 수도 있으므로 공백제거
   elif command == ">":
       st = st[1:]
       inputStr = st.strip()
       if inputStr in dic:
           print(dic[inputStr])
       else:
           print("{}가 사전에 없습니다.".format(inputStr))
   elif command == 'q':
       break
   else: 
       print("입력 오류가 발생하였습니다.")
print("사전 프로그램을 종료합니다.")

위는 내가 짠 코드이고 아래는 책에서 짜여져 있는 코드인데 일단 input으로 들어온 코드는 문자열로 받기 때문에 st[0]을 쓰는 것이 신선했고 split()이 리스트로 반환한다는 것도 새로 알았고 그렇기에 만약 len()으로 길이를 봤을 때 2보다 작다면 잘못 입력한 것이니(정확히는 :를 쓰지 않음) 그거를 잡아내는 코드를 적은 것도 인상깊었고 strip()으로 깔끔하게 만드는 것도 좋았다

그리고 format으로 'a 가'로 출력되게 하지 않는 것도 좋은 생각같았다

 

5. 순서가 중요하지 않은 대상들이 모이면 : 집합

집합(set): 튜플과 달리 순서가 없는 자료형

동일한 합을 가지는 항목의 중복이 허용되지 않음

교집합, 합집합, 차집합, 대칭차집합 등의 집합 연산을 수행할 수 있음

numbers = {2, 1, 3}

이거는 집합으로 딕셔너리와 다르게 :로 key, value를 지정하지 않는다

리스트로부터 집합을 생성도 가능

set([1, 2, 3, 1, 2])

요소가 중복되면 자동으로 요소를 제거함

문자열로 집합을 생성하면 각 문자들이 하나의 요소가 됨

numbers = set()

set() 함수를 이용하여 비어 있는 집합을 생성도 가능함

 

6. 집합의 항목에 접근하는 연산

in 연산자 사용 가능

인덱스를 가지고 접근은 할 수 없지만 for 반복문을 통한 접근은 가능함

출력되는 순서는 입력되는 순서와 다르며 sorted()로 정렬도 가능함

add()나 remove() 메소드로 추가나 삭제할 수 있음

 

7. 집합에 적용할 수 있는 다양한 연산들을 살펴보자

==와 != 연산자를 사용해서 집합이 서로 같은지도 검사 가능

< <= 왼쪽의 집합이 오른쪽 집합의 진부분 집합인지 부분 집합인지 검사 가능

* 진부분 집합: 자기 자신을 제외한 부분집합

> >= 진상위 집합인지 상위 집합인지 검사 가능

* 상위 집합: 다른 집합들을 포함하는 집합/ 진상위 집합은 아마 자기자신을 제외하는 거겠지?

 

len() max() min() sorted() sum() 메소드 사용 가능

 

논리 연산은 all() any()가 있으며 all()은 모든 항목들에 대한 and 연산/any()는 모든 항목들에 대해 or 연산

 

8. 풍부하고 멋진 집합 연산이 있다

합집합: 2개의 집합을 합함

| union()

교집합: 겹치는 요소 구함

& intersection()

차집합: 집합에서 집합 요소 빼기

- difference()

대칭차집합: 두 집합의 합집합에서 교집합을 뺀 요소를 구하는 연산

^ symmetry_difference()

partyA = set(["Park", "Kim", "Lee"])
partyB = set(["Park", "Choi"])

print(partyB & partyB)
partyA = set(["Park", "Kim", "Lee"])
partyB = set(["Park", "Choi"])

print(partyA | partyB)
print((partyA | partyB) - (partyA & partyB))
print(partyA - partyB)

 

9. 파일로부터 자료를 읽고 저장해보자

파일: 컴퓨터의 저장 장치 내에 데이터를 저장하기 위해 사용하는 논리적인 단위

하드디스크나 외장디스크 같은 저장 장치에 저장한 후 필요할 때 불러서 사용하거나 수정하는 것도 가능

f = open('hello.txt', 'w') # open() 명령을 통해서 hello.txt 라는 파일을 열게됨 (만약 없다면 생성하는듯) 뒤의 인자가 w면 쓰기 모드 r이면 읽기 모드로 열게 됨 이때 f는 파일 객체를 갖게 됨 (hello.txt라는?)
f.write('Hello World!') # 파일을 씀
f.close() # 파일 닫기
def process(w):
    output = ""
    for ch in w:
        if ch.isalpha():
            output += ch
    return output.lower()

words = set()
fname = input("입력 파일 이름: ")
file = open(fname, "r")

for line in file:
    lineWords = line.split()
    for word in lineWords:
        words.add(process(word))

print("사용된 단어의 개수 =", len(words))
print(words)

계속 마지막 .이 안 사라지길래 이래저래 해보니까 문제는 애초에 proverb 파일 자체에 문장 뒤에 스페이스바가 한번 들어가 있어서 그랬던 것이다 챗지피티도 개소리만 하던데 역시 챗지피티는 다 믿을 수 없을듯 지 실수를 인정 안하고 거짓말을 해버리니까

 

10. 두 수의 약수와 최대공약수 그리고 프로그래밍적인 사고

프로그래밍적 사고 방식: 문제를 해결하는 단계적 과정을 고안해 보고 그 과정을 구현하는 것

 

요약

1. 딕셔너리는 키와 값을 가지는 파이썬의 기본 자료형, a = {}으로 선언 집합은 set()으로 공백 집합을 생성 가능함 차이 있음

2. lamda x, y : x + y(100, 200) 함수화된 기능만 불러서 사용하기 위해서 씀

3. split()은 리스트를 반환하며 strip는 양 옆의 공백을 제거한다

4. 집합은 순서가 없음 요소가 중복되면 자동 삭제됨 union(|), intersection(&), difference(-), symmetry_difference(^) 순서대로 합집합, 교집합, 차집합, 대칭차집합 연산을 사용할 수 있다는게 큰 장점

차집합은 A B 집합일 때 A만 가지고 있는 요소, 대칭차집합은 합집합에서 교집합을 뺀 요소

5. 파일은 open()을 이용해서 객체를 불러와서 r, w 인자를 전달 해줘서 읽거나 쓸 수 있음

 

728x90
반응형