본문 바로가기

Programming Language/Python

Python - 문법 공부 정리(9~10)

728x90
반응형

Ch9. Dictionary

 

-리스트는 순서를 유지하는 값들의 컬렉션인 것과 달리 딕셔너리에는 순서가 없고 모든 원소들은 키 값을 가지고 있다.

딕셔너리는 값을 찾기 위해 숫자 대신에 키 값을 이용한다는 것에서 리스트와 큰 차이를 보인다. (나머지는 비슷!)

 

  • 딕셔너리의 응용

get 메소드

단어가 몇 번 나왔는지 셀 수 있음.

두 개의 반복 변수

for문에 두 개의 변수를 사용할 수 있음.

 

 

ex)

밑에는 내가 짠 코드와 주석 설명!!!

#사용자에게 파일 이름 입력받기
name = input("Enter file: ")
#파일 이름이 1보다 작으면 지정해 둔 이름으로 출력될 수 있게 하기
# -> 즉 엔터를 입력하면 "mbox-short.txt"로 바로 입력됨!!!
if len(name) < 1:
    name = "mbox-short.txt"
# try except문을 이용해서 잘못된 형식의 파일 이름이 입력 되었을 경우 예외처리 하기
try:
    handle = open(name)
except:
    print("잘못된 형식의 파일 이름입니다.")
    quit()
#개수를 세는 counts는 빈 딕셔너리 생성, lst는 빈 리스트 생성
counts = dict()
lst = list()
# txt파일들 중 from으로 시작한 문장 필터링 후 인덱스 번호 1번째 위치에 있는 원소들만 걸러내서 append 메소드를 사용해 빈 리스트에 추가하기!
for line in handle:
    if not line.startswith('From '): #'From'으로 시작하는 문장만 추출하기
        continue
    wds = line.rstrip().split()	#출력한 문장들의 오른쪽 공백을 제거하고 단어별로 분리하기
    value = wds[1]	#이메일 주소에 해당하는 인덱스 번호 1번째에 위치하는 원소들만 value라는 변수에 저장.
    lst.append(value)	#그것들만 빈 리스트에 추가하기
for word in lst:
    counts[word] = counts.get(word,0) + 1	#리스트에 있는 요소들이 총 몇 번씩 있는지 세기
print(counts)	#딕셔너리 형태로 {yewon:1}이런식으로 출력됨!
# 제일 많이 나온 단어와 그 횟수를 출력하기 위해 다음과 같이 변수 지정.
bigcount = None	
bigword = None
for word,count in counts.items():
    if bigcount is None or count > bigcount:
        bigword = word
        bigcount = count
print(bigword, bigcount)

출력결과

* 오래 걸렸지만 온전히 내 힘으로 해낸 것이라 무지무지 뿌듯하다!!ㅎㅎㅎ

+ 코드블럭을 사용할 수 있다는 걸 이번에 처음 알아서 해봤는데, 캡쳐해서 하는 것 보다 훨씬 편하고 좋다...ㅎㅎ..... 이젠 맨날맨날 이거 써야지.

 

 


Ch10. Tuple

 

-리스트와 튜플은 매우 비슷하다. 눈에 띄는 차이는 대괄호 대신 소괄호를 사용했다는 것 정도인데 리스트처럼 순서가 있어서 인덱스로도 접근이 가능하고 최대값도 찾을 수 있다. But!! 튜플은 리스트와 달리 값의 변경이 불가능하다.

-> 이러한 속성들로 인해 용량을 덜 차지하고 빠르게 처리할 수 있다. 또 여러 값에 대해 비교가 가능하다!

 

 

ex)

name = input("Enter file: ")
if len(name) < 1:
    name = "mbox-short.txt"
try:
    handle = open(name)
except:
    print("Invalid")
    quit()
# 앞의 예제와 똑같은 방식으로!
lst = list()
di = dict()
for line in handle:
    if not line.startswith('From '):
        continue
    wds = line.rstrip().split()
    # 찾아서 나눈 후 인덱스 5번째에 위치하는 시간을 출력한다.
    value = wds[5]
    # 시간중에서도 hour에 해당하는 부분만 필터링하기 위해서 ':' 구분자를 지정해서 출력한다.
    time = value.rstrip().split(':')
    # 그 중 hour의 숫자만 카운트할 것이기 때문에 인덱스 0번째에 위치하는 '시'를 hrs에 넣어준다.
    hrs = time[0]
    # 아까 만들어둔 빈 리스트 lst에 append 메소드를 사용하여 추가!
    lst.append(hrs)
# 리스트 lst 안에 있는 요소들의 개수 카운트하기
for w in lst:
    di[w] = di.get(w,0) + 1
# 튜플로 나타내기 위한 빈 리스트 생성
tmp = list()
# List Comprehension 으로 동적인 리스트 생성
tmp = sorted([(v,k) for v,k in di.items()])
# 반복문을 사용하여 왼쪽에는 시간, 오른쪽에는 개수를 출력
for v,k in tmp:
    print(v,k)

출력결과

* 코드 마지막 줄 tmp[:3]등 슬라이싱을 활용해 지정 범위만큼만 출력할 수도 있다.

* 또 v,k의 위치를 바꿔서 키를 기준으로 출력하는 것이 아니라 값을 기준으로 출력할 수도 있다.

 

 


파이썬 문법 공부 끄읕-!

728x90
반응형