본문 바로가기

온라인 강의/Python(네이버 부스트코스)

딕셔너리와 튜플

반응형

1. 딕셔너리(Dictionary)

purse = dict() # 또는 purse = {} 와 같이 생성할 수도 있습니다.
purse['money'] = 12 # 'money'라는 키에 12라는 값 연결
purse['candy'] = 3  # 'candy'라는 키에 3이라는 값 연결
purse['tissues'] = 75 # 'tissues'라는 키에 75라는 값 연결
counts = dict()
names = ['csev', 'cwen', 'csev', 'zqian', 'cwen']
for name in names :
    if name in counts: 
        counts[name] = counts[name] + 1
    else :
        counts[name] = 1
print(counts)

get 메소드

counts.get(name, 0)의 의미는 counts 딕셔너리에 name이라는 키가 존재할 경우 name에 대한 값을 불러오고,

그렇지 않을 경우에는 counts 딕셔너리에 name이라는 키에 0이라는 값을 갖는 데이터를 추가하라는 의미

counts = dict()
names = ['csev', 'cwen', 'csev', 'zqian', 'cwen']
for name in names :
    counts[name] = counts.get(name, 0) + 1
print(counts)

split 메소드

line = 'The general pattern to count the words'
print(line.split())

# ['The', 'general', 'pattern', 'to', 'count', 'the', 'words']

* 갯수 출력하기

for word in words:
    counts[word] = counts.get(word,0) + 1
print('Counts', counts)

# Counts {'The': 2, 'general': 2, 'pattern': 2, 'to': 6, 'count': 4, 'the': 8, 'words': 4, 'in': 2, 'a': 4, 'line': 4, 'of': 4, 'text': 2, 'is': 2, 'split': 2, 'into': 2, 'words,': 2, 'then': 2, 'loop': 2, 'through': 2, 'and': 2, 'use': 2, 'dictionary': 2, 'track': 2, 'each': 2, 'word': 2, 'independently.': 2}

* 딕셔너리의 키나 값을 별도로 저장하는 법

counts = { 'chuck' : 1 , 'fred' : 42, 'jan': 100}
for key in counts:
    print(key, counts[key])

# chuck 1
# fred 42
# jan 100

딕셔너리를 리스트로 변환하면 이와 같이 키로만 구성된 리스트를 얻을 수 있음

jjj = { 'chuck' : 1 , 'fred' : 42, 'jan': 100}
print(list(jjj))
# ['jan', 'chuck', 'fred']

딕셔너리의 keys라는 메소드를 사용해도 같은 결과를 얻을 수 있음

jjj = { 'chuck' : 1 , 'fred' : 42, 'jan': 100}
print(jjj.keys())
# ['jan', 'chuck', 'fred']

딕셔너리의 값으로만 구성된 리스트를 얻으려면 values라는 메소드를 사용

jjj = { 'chuck' : 1 , 'fred' : 42, 'jan': 100}
print(jjj.values())
# [100, 1, 42]

items 메소드

'튜플(tuple)'이라는 자료 구조 안에 키와 값이 쌍을 이루어 저장된 리스트가 반환

jjj = { 'chuck' : 1 , 'fred' : 42, 'jan': 100}
print(jjj.items())
# [('jan', 100), ('chuck', 1), ('fred', 42)]
jjj = { 'chuck' : 1 , 'fred' : 42, 'jan': 100}
for aaa,bbb in jjj.items() :
    print(aaa, bbb)

# chuck 1
# fred 42
# jan 100

파일에 저장된 데이터 읽어와서 빈도 분석하기

name = input('Enter file:')
handle = open(name)

counts = dict()
for line in handle:
    words = line.split()
    for word in words:
        counts[word] = counts.get(word,0) + 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)
# Enter file: words.txt

# 딕셔너리를 활용한 딕셔너리 정렬

fname = input('Enter File: ')
if len(fname) < 1 : fname = 'clown.txt'
hand = open(fname)

di = dict()
for lin in hand :
    lin = lin.rstrip()
    wds = lin.split()
    for w in wds :
        di[w] = di.get(w,0) + 1
        
largest = -1
theword = None
for k, v in di.items() :
    print(k,v)
    if v > largest : 
        largest = v
        theword = k
        
print('Done', theword, largest)

 

2. 튜플(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

리스트를 튜플로 변환

list = ['a', 1, 'b', 2, 'c', 3]
dict = {list[i]: list[i + 1] for i in range(0, len(list), 2)}

print(list)
print(dict)

변경 불가능한 속성 (immutable) 

한 번 생성된 튜플은 정렬하거나, 값을 추가하거나, 순서를 바꿀 수 없음

(0, 1, 2) < (5, 1, 2)
# True 값을 가집니다.
 (0, 1, 2000000) < (0, 3, 4)
# True 값을 가집니다.
 ( 'Jones', 'Sally' ) < ('Jones', 'Sam')
# True 값을 가집니다.
 ( 'Jones', 'Sally') > ('Adams', 'Sam')
# True 값을 가집니다.

키를 기준으로 정렬하기

위의 두 가지 특성을 활용하면 키를 기준으로 딕셔너리를 정렬

  1. 딕셔너리에서 items 메소드를 실행해 튜플로 이루어진 리스트 형태로 만든다.
  2. 이 리스트를 sorted 함수로 정렬한다. 그러면 각각의 튜플의 왼쪽 값, 즉 키를 기준으로 정렬이 된다.
d = {'b':1, 'a':10, 'c':22}
d.items()
# dict_items([('b', 1), ('a', 10), ('c', 22)])
sorted(d.items())
# [('a', 10), ('b', 1), ('c', 22)]

 

for k, v in sorted(d.items()):
    print(k, v)
# a 10
# b 1
# c 22

값을 기준으로 정렬하기

  1. 딕셔너리에서 items 메소드를 실행한다.
  2. 튜플을 활용해 키와 값을 분리한다.
  3. 키와 값의 위치를 바꾼 리스트를 생성한다.
  4. 생성된 리스트를 정렬한다.
c = {'a':10, 'b':1, 'c':22}
tmp = list()
for k, v in c.items() :
    tmp.append( (v, k) )

print(tmp)
# [(10, 'a'), (1, 'b'), (22, 'c')]
tmp = sorted(tmp)
print(tmp)
# [(1, 'b'), (10, 'a'), (22, 'c')]

여기에서 만약 내림차순으로 정렬하고 싶다면 다음과 같이 sorted 함수에 reverse 옵션을 True로 설정

c = {'a':10, 'b':1, 'c':22}
tmp = list()
for k, v in c.items() :
    tmp.append( (v, k) )

print(tmp)
# [(10, 'a'), (1, 'b'), (22, 'c')]
tmp = sorted(tmp, reverse=True)
print(tmp)
# [(22, 'c'), (10, 'a'), (1, 'b')]

가장 많이 등장한 단어 Top 10 출력하기

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

lst = []
for key, val in counts.items():
    newtup = (val, key) 
    lst.append(newtup)

lst = sorted(lst, reverse=True)

for val, key in lst[:10] :
    print(key, val)

리스트 컴프리헨션 (List comprehension)

c = {'a':10, 'b':1, 'c':22}
tmp = list()
for k, v in c.items() :
    tmp.append( (v, k) )

tmp = sorted(tmp)
print(tmp)

# [(1, 'b'), (10, 'a'), (22, 'c')]

 

c = {'a':10, 'b':1, 'c':22}
print( sorted( [ (v,k) for k,v in c.items() ] ) )
# [(1, 'b'), (10, 'a'), (22, 'c')]

#튜플을 이용한 딕셔너리 정렬

fname = input('Enter File: ')
if len(fname) < 1 : fname = 'clown.txt'
hand = open(fname)

di = dict()
for lin in hand :
    lin = lin.rstrip()
    wds = lin.split()
    for w in wds :
        di[w] = di.get(w,0) + 1
        
tmp = list()
for k, v in di.items() :
    newt = (v,k)
    tmp.append(newt)
    
tmp = sorted(tmp, reverse = True)

for v,k in tmp[:5] :
    print(k,v)
반응형