본문 바로가기
Python/PY4E

PY4E Chapter 10. Tuples

by 전자여우 2022. 8. 8.

Tuple

튜플은 소괄호(())로 이루어져 있으며 위치와 순서가 정해져 있어 리스트와 비슷하게 작동한다.

x = ('Glenn', 'Sally', 'Joseph')
print(x[2]) # Joseph
y = (1, 9, 2)
print(y) # (1, 9, 2)
print(max(y)) # 9

for iter in y:
	print(iter)
# 1
# 9
# 2

튜플이 리스트와 다른 점은 변경을 할 수 없다는 것이다.

튜플의 이점은 용량을 적게 차지하고 접근이 빠르기 때문에 리스트보다 효율적이다.

 

튜플과 딕셔너리

items() 메서드를 통해 반환되는 값은 키와 밸류로 이루어진 튜플의 리스트이다.

d = {'csev' : 2, 'cwen' : 4}
tups = d.items():
print(tups) # [('csev', 2),('cwen', 4)]

튜플의 이점 중 하나는 서로 비교가 가능하다는 점이다. 비교 시 왼쪽을 우선으로 비교하게 되며, 값이 같을 경우 바로 오른쪽의 값을 비교하게 된다.

(0, 1, 2) < (5, 1, 2) # True
(0, 1, 2000000) < (0, 3, 4) # True. 0이 같기 때문에 1과 3을 비교하여 결과를 반환한다.
('Jones', 'Sally') < ('Jones', 'Sam') # True. 문자열의 비교는 철자의 순서에 따라 정해진다. a < z
('Jones', 'Sally') < ('Adams', 'Sam') # False. A는 J보다 작다.

 

딕셔너리에서 정렬된 튜플 리스트 반환받기

# key 기준으로 정렬
d = {'a':10, 'b':1, 'c':22}
sorted(d.items()) #[('a', 10), ('b', 1), ('c', 22)]

# value 기준으로 정렬
tmp = list()
for k, v in d.items():
	tmp.append((v, k))
tmp = sorted(tmp, reverse=True) # 내림차순 역순정렬
# [(22, 'c'), (10, 'a'), (1, 'b')]

 

가장 많이 나온 단어들 top 10

# 1. 센다
fhand = open('romeo.txt')
counts = dict()
for line in fhand:
	words = line.split()
    for word in words:
    	counts[word] = counts.get(word, 0) + 1

# 2. key, value를 뒤집어 튜플로 만든 뒤 리스트에 저장한다.
lst = list()
for key, val in counts.items():
	newtup = (val, key)
    lst.append(newtup)

# 3. 내림차순으로 정렬한다.
lst = sorted(lst, reverse = True)

# 4. 위에서 10개를 가져와서 다시 key value 순서로 출력한다.
for val, key in lst[:10]:
	print(ket, val)
    

# 2, 3번 자리를 꿰찰 짧은 버젼 (오름차순 정렬)
print( sorted( [ (v,k) for k,v in counts.items() ] ) )

 

Assignment

Assignment 10.2는 이전과 마찬가지로 mbox-short.txt를 읽고 'From: '으로 시작되는 행을 탐색한 뒤 각 메시지에 대한 시간별 분포를 알려주는 프로그램을 작성하는 것이었다. 우선 split() 함수를 통해 시간을 찾은 다음 콜론을 사용하여 문자열을 다시 한번 분할하여 시간을 추출해내야 했다. 그다음엔 각 시간에 대한 카운트를 세어 주는 루프를 돌린 후, 시간별로 정렬하여 카운트를 출력해야 했다.

나의 풀이는 다음과 같다.

# ex_10_2
name = input("Enter file:")
if len(name) < 1:
    name = "mbox-short.txt"
handle = open(name)

count = dict()
res = list()

for line in handle:
    if not line.startswith('From ') : continue
    line = line.split()
    line = line[5]
    line = line.split(':')
    line = line[0]
    count[line] = count.get(line, 0) + 1

for k,v in sorted(count.items()):
    #tupp = (k,v)
    #res.append(tupp)
    print(k,v)

이것으로 PY4E의 두 번째 강의인 Python Data Structures를 마치게 되었다.

'Python > PY4E' 카테고리의 다른 글

PY4E Chapter 11. Regular Expressions  (0) 2022.08.09
PY4E Chapter 9. Dictionaries  (0) 2022.08.08
PY4E Chapter 8. Lists  (0) 2022.08.08
PY4E Chapter 7. Files  (0) 2022.08.07
PY4E Chapter 6. Strings  (0) 2022.08.05

댓글