Python #3
4차인재 양성사업
과학기술 빅데이터 분석가 과정 - 4주
김정훈 강사님
이 날 받은 과제가 어려워 반에서 유일하게 문제를 풀었던 언니의 답변을 단톡방으로 공유받아
실행해보았다. 진짜 실력있는 언니고 코드가 너무나 간결하고 예뻐서 감탄했었고 또 선뜻 공유해줘서 너무 고마웠다..ㅜㅜ
코드를 실행해가며 읽어보니 과제 위쪽의 코드 섹션을 생략하고 더 간단하게 풀 수 있는 방법이 있길래 제안했고
언니가 수정하여 다시 공유한 답변이 2번 답안이다.
Day_03_01_dict
dictionary 기본
# key value
# 영한사전 : 영어 단어를 찾으면 한글 설명이 나옴
# key value---------->
d1 = {'name' : 'hoon', 'age':20 }
print(d1)
print(d1['name'], d1['age'])
지난 시간에 이어 dictionary에 대해 해보자면, dictionary는 말 그대로 사전과 같다.
key값과 value값을 가지며, key값으로 value를 찾을 수 있는 자료형인 것이다.
나열된 문자열이나 리스트에서 조건을 설정해가며 찾는 것 보다 책갈피를 끼워둔 듯 원하는 값을 찾을 수 있다는 편리함이 있다.
d1['hobby'] = 'badminton'
d1['hobby'] = 'mount'
print(d1)
# 출력결과
# {'name': 'hoon', 'age': 20, 'hobby': 'mount'}
print(d1.keys())
print(d1.values())
# 출력결과
# dict_keys(['name', 'age', 'hobby'])
# dict_values(['hoon', 20, 'mount'])
dictionary에는 iterable : 반복할 수 있다, 즉 for문에 바로 연결해서 쓸 수 있다는 특성이 있다.
위 두 개의 d1에 대한 출력값은 적어둔 바와 같고
위 d1, d1.keys, d1.items를 for문을 활용해 출력이 가능하다는 뜻이다.
지금 예시로 든 dictionary야 워낙 작다 보니 감이 잘 잡히진 않지만
수십, 수백개의 key와 value가 포함된 dictionary를 다루는 경우라면 참고할 만한 점일 듯하다.
for k in d1.keys():
print(k,d1[k])
print()
for k in d1: # 모든 컬렉션은 반복문에 쓸 수 있다
print(k,d1[k])
print()
for k,v in d1.items():
print(k,v)
# 출력결과
# name hoon
# age 20
# hobby mount
set을 이용한 unique한 값 출력
s = {1, 2, 3, 1, 2, 3, 1, 2, 3}
print(s)
t = [1, 2, 3, 1, 2, 3, 1, 2, 3]
print(list(set(t)))
# {1, 2, 3}
# [1, 2, 3]
아래 list(set(t)) 를 설명하자면,
형변환을 할 때 set 형변환으로 unique하게, 즉 중복된 값을 지우고 인자 든 것만 각각 뽑을 수 있다고 한다.
t에 대해 단순히
>> print(list(t)) 라고만 하면 [1, 2, 3, 1, 2, 3, 1, 2, 3] 로 전체가 출력이 된다.
하지만 s처럼 set로 형변환을 해 준 뒤 다시 list로 형변환을 하면
t의 list안에 있는 값들 중 unique한 인자들만 빼낸 뒤 다시 원래대로 list로 출력이 된다는 것이다.
Day_03_02_file
이 섹션에서는 lyrics라는 텍스트파일을 생성해 가사를 읽어오는 동일한 함수를 여러 방식으로 만들어보았다.
아무 곡이나 원하는 곡을 검색해 텍스트파일을 복사 - 붙여넣기하여 .txt로 저장했으므로
원하는 곡으로 자유롭게 파일을 만든 뒤 경로만 수정해 실습해보면 된다.
line.strip()
#-*-coding utf-8-*-
import re
import csv
def read_1():
# 기본값 (cp 949) 한글('utf-9', 'euc-kr')
# f = open('Data/lyrics.txt', 'r', encoding='utf-8') # 작동하지않았음
f = open('/Users/9n0421/Desktop/python/Data/lyrics.txt', 'r', encoding='utf-8')
#command + 함수 클릭하면 default parameter가 보임.
lines = f.readlines()
for line in lines :
# print(line, end='')
print(line.strip()) # strip : 양쪽 끝의 문자를 없애줌
f.close()
sample = '\n\n\n\t\t\t AB CD\n\n\n'
print('['+sample+']')
print('['+sample.strip()+']')
# print(line, end=' ') 대신 print(line.strip())를 쓰는 이유는
데이터를 읽어오는건데 데이터도 아닌 개행문자를 프린트에서 없애는건 의미가 없기 때문이다.
데이터 자체에서 없애주는게 더 좋은 코드라고 한다.
마지막 줄의 print('[+sample.strip()+']') 는 개행문자 탭문자 스페이스를 전부 없애준다. 문자 사이 공백은 안 없앤다.
def read_2():
f = open('/Users/9n0421/Desktop/python/Data/lyrics.txt', 'r', encoding='utf-8')
# 거짓 : False, 0, 0.0, '', [], {}, NoneS
while True:
line = f.readline()
# print(len(line))
# if len(line) == 0 :
# if not len(line) :
if not line :
break
print(line.strip())
f.close()
def read_3():
f = open('/Users/9n0421/Desktop/python/Data/lyrics.txt', 'rb', encoding='utf-8')
# binary file : 자기만의 포맷을 갖고있다. 읽을때 키워드 r 대신 rb
for line in f:
print(line.strip())
f.close()
def read_4():
with open('Data/lyrics.txt', 'r', encoding='utf-8') as f:
# 파일 위치 문제로 이 함수만 lyrics 경로를 수정했을 뿐 동일한 파일에 대한 작업이다.
for line in f:
print(line.strip())
f.close()
문제 1. iris.csv 파일을 데이터만 뽑아서 깔끔하게 출력하세요
def read_iris():
f = open('Data/iris.csv', 'r', encoding='utf-8')
for line in f:
# print(re.findall(r'(.+?)[,\n]', line))
# .+? : 아무거나 짧은 것. [,\n] : 쉼표로 끝나거나 개행문자로 끝나는 모든걸 찾겠다는 의미
# # fineall이 리턴하는 값이 list니까지,..그지...하나만 알고 둘은 모르지...ㅠ
# r = re.findall(r'(.+?)[,\n]', line)
# print(type(r))
# r = re.findall(r'(.+?)[,\n]', line)
# print(type(r)) #list네 의미있네..!
# line = line.strip() + ','
# print(re.findall(r'(.+?),',line))
print(line)
# print(line.strip().split(','))
def read_iris_by_csv():
f = open('Data/iris.csv', 'r', encoding='utf-8')
for line in csv.reader(f):
# 이거 하려고 만든 거니까 이거 잘한다고함..굉장히 간단해서 허무했다..
print(line)
f.close()
# read_iris()
read_iris_by_csv()
Day_03_03_comprehension