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 인자를 전달 해줘서 읽거나 쓸 수 있음
'코딩의 기록' 카테고리의 다른 글
따라하며 배우는 파이썬과 데이터과학 -9. 텍스트를 처리해보자- (0) | 2025.02.13 |
---|---|
따라하며 배우는 파이썬과 데이터과학 8장 심화문제 (1) | 2025.02.02 |
유클리드 호제법 (+ 유클리드의 소수의 무한성 증명) (1) | 2025.01.30 |
따라하며 배우는 파이썬과 데이터과학 7장 심화문제 (0) | 2025.01.20 |
따라하며 배우는 파이썬과 데이터 과학 -7.데이터를 리스트와 튜플로 묶어보자- (0) | 2025.01.18 |