생능출판사 (가칭)"데이터과학 파이썬" 코드 8장

8.1 딕셔너리

In [1]:
phone_book = { }    # 공백 딕셔너리를 생성
In [2]:
phone_book["홍길동"] = "010-1234-5678"
In [3]:
print(phone_book)
{'홍길동': '010-1234-5678'}
In [4]:
phone_book = {"홍길동": "010-1234-5678"}
In [5]:
phone_book["강감찬"] = "010-1234-5679"
phone_book["이순신"] = "010-1234-5680"
print(phone_book)
{'홍길동': '010-1234-5678', '강감찬': '010-1234-5679', '이순신': '010-1234-5680'}

8.2 딕셔너리의 기능을 알아보자

In [6]:
person_dic = {'Name': '홍길동', 'Age': 7, 'Class': '초급'} 
 
print(person_dic['Name']) 
print(person_dic['Age']) 
홍길동
7
In [7]:
print(phone_book["강감찬"])
010-1234-5679
In [8]:
phone_book.keys()
Out[8]:
dict_keys(['홍길동', '강감찬', '이순신'])
In [9]:
phone_book.values()
Out[9]:
dict_values(['010-1234-5678', '010-1234-5679', '010-1234-5680'])
In [10]:
phone_book.items() 
Out[10]:
dict_items([('홍길동', '010-1234-5678'), ('강감찬', '010-1234-5679'), ('이순신', '010-1234-5680')])
In [11]:
for name, phone_num in phone_book.items():
  print(name,':', phone_num)
홍길동 : 010-1234-5678
강감찬 : 010-1234-5679
이순신 : 010-1234-5680

8.3 딕셔너리의 메소드

In [12]:
phone_book = {"홍길동": "010-1234-5678"} 
phone_book["강감찬"] = "010-1234-5679" 
phone_book["이순신"] = "010-1234-5680"
In [13]:
for key in phone_book.keys(): 
  print(key, ':', phone_book[key])
홍길동 : 010-1234-5678
강감찬 : 010-1234-5679
이순신 : 010-1234-5680
In [14]:
sorted(phone_book)       # 딕셔너리를 키를 기준으로 정렬하며 리스트를 반환
Out[14]:
['강감찬', '이순신', '홍길동']
In [15]:
sorted_phone_book = sorted(phone_book.items(), key=lambda x: x[0])
print(sorted_phone_book)
[('강감찬', '010-1234-5679'), ('이순신', '010-1234-5680'), ('홍길동', '010-1234-5678')]
In [16]:
del phone_book["홍길동"]   # "홍길동" 키를 이용하여 딕셔너리의 한 항목 삭제
print(phone_book)
{'강감찬': '010-1234-5679', '이순신': '010-1234-5680'}
In [17]:
phone_book.clear() 
print(phone_book)
{}

LAB 8-1 편의점 재고 관리

In [18]:
items = { "커피음료": 7, "펜": 3, "종이컵": 2, 
    "우유": 1, "콜라": 4, "책": 5 }

item = input("물건의 이름을 입력하시오: ");
print(items[item])
물건의 이름을 입력하시오: 펜
3

LAB 8-2 영한 사전을 만들어 보자

In [29]:
print("사전 프로그램 시작... 종료는 q를 입력")
dictionary = {}

while True:
    st = input('$ ')
    command = st[0]     # 첫 입력 문자를 추출한다
    if command == '<':
        st = st[1:]
        inputStr = st.split(':')
        if len(inputStr) < 2 :
            print('입력 오류가 발생했습니다.')
        else:
            dictionary[inputStr[0].strip()] = inputStr[1].strip()
    elif command == '>':
        st = st[1:]
        inputStr = st.strip()
        if inputStr in dictionary:
            print(dictionary[inputStr])
        else :
            print('{}가 사전에 없습니다.'.format(inputStr))
    elif command == 'q':
       break
    else :
        print('입력 오류가 발생했습니다.')

print("사전 프로그램을 종료합니다.")
사전 프로그램 시작... 종료는 q를 입력
$ < one:하나
$ < two:둘
$ < house:집
$ < Korea:한국
$ one
입력 오류가 발생했습니다.
$ >one
하나
$ >house
집
$ >body
body가 사전에 없습니다.
$ q
사전 프로그램을 종료합니다.

8.4 집합

In [20]:
numbers = {2, 1, 3}   # 숫자 3개로 이루어진 집합 자료형
numbers
Out[20]:
{1, 2, 3}
In [21]:
set([1, 2, 3, 1, 2])   # 리스트로부터 집합을 생성함
Out[21]:
{1, 2, 3}
In [22]:
set("abcdefa")         # 문자열도 시퀀스형이라서 집합형으로 변환이 가능하다
Out[22]:
{'a', 'b', 'c', 'd', 'e', 'f'}
In [23]:
numbers = set()       # 비어있는 집합 생성

8.5 집합의 항목에 접근하는 연산

In [24]:
numbers = {2, 1, 3}
if 1 in numbers:     # 1이라는 항목이 numbers 집합에 있는가 검사
    print("집합 안에 1이 있습니다.")
집합 안에 1이 있습니다.
In [25]:
numbers = {2, 1, 3}
for x in numbers:
    print(x, end=" ")
1 2 3 
In [26]:
for x in sorted(numbers):
    print(x, end=" ")
1 2 3 
In [27]:
numbers = {1, 2, 3}
numbers.add(4)
numbers
Out[27]:
{1, 2, 3, 4}
In [28]:
numbers.remove(5)
numbers
---------------------------------------------------------------------------
KeyError                                  Traceback (most recent call last)
<ipython-input-28-88461182bdc9> in <module>
----> 1 numbers.remove(5)
      2 numbers

KeyError: 5
In [30]:
a_list = ['hello', 'world', 'welcome', 'to', 'python']
'python' in a_list
Out[30]:
True

8.6 집합에 적용할 수 있는 다양한 연산들

In [31]:
A = {1, 2, 3}
B = {1, 2, 3}
A == B
Out[31]:
True
In [32]:
A = {1, 2, 3, 4, 5}
B = {1, 2, 3}
B < A
Out[32]:
True
In [33]:
a_set = {1, 5, 4, 3, 7, 4 }    # 6개 항목으로 집합 생성
len(a_set)                     # 항목의 개수는 중복을 제외하면 5
Out[33]:
5
In [34]:
max(a_set)                     # 항목 가운데 가장 큰 수는 7
Out[34]:
7
In [35]:
min(a_set)                     # 항목 가운데 가장 작은 수는 1
Out[35]:
1
In [36]:
sorted(a_set)                  # 항목을 정렬하여 리스트 만든다. 중복은 제거
Out[36]:
[1, 3, 4, 5, 7]
In [37]:
sum(a_set)                     # 중복 원소는 하나만 사용되므로 전체 합은 20
Out[37]:
20
In [38]:
a_set = { 1, 0, 2, 3, 3}
all(a_set), any(a_set)   # a_set이 모두 True인가?, a_set에 0이 있는가? 검사
Out[38]:
(False, True)

8.7 집합 연산

In [39]:
A = {1, 2, 3}
B = {3, 4, 5}
In [40]:
A | B    # 합집합 연산
Out[40]:
{1, 2, 3, 4, 5}
In [41]:
A.union(B)   # 합집합 메소드
Out[41]:
{1, 2, 3, 4, 5}
In [42]:
A & B    # 교집합 연산
Out[42]:
{3}
In [43]:
A.intersection(B) # 교집합 메소드
Out[43]:
{3}
In [44]:
A - B    # 차집합 연산
Out[44]:
{1, 2}
In [45]:
A.difference(B) # 차집합 메소드
Out[45]:
{1, 2}
In [46]:
A ^ B    # 대칭 차집합 연산
Out[46]:
{1, 2, 4, 5}
In [47]:
A.symmetry_difference(B)
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-47-7eab29653fef> in <module>
----> 1 A.symmetry_difference(B)

AttributeError: 'set' object has no attribute 'symmetry_difference'

LAB 8-3 파티 동시 참석자 알아내기

In [48]:
partyA = set(["Park", "Kim", "Lee"])
partyB = set(["Park", "Choi"])

print("2개의 파티에 모두 참석한 사람은 다음과 같습니다. ")
print ( partyA.intersection(partyB))
2개의 파티에 모두 참석한 사람은 다음과 같습니다. 
{'Park'}

LAB 8-4 파일에서 중복되지 않은 단어의 개수 구하기

In [50]:
# 단어에서 구두점을 제거하고 소문자로 만든다. 
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.txt
사용된 단어의 개수= 18
{'fast', 'half', 'birds', 'a', 'done', 'that', 'ends', 'begun', 'bad', 'feather', 'flock', 'together', 'news', 'is', 'of', 'alls', 'well', 'travels'}

8.8 두 수의 약수와 최대공약수

In [51]:
num = 10
divisors = []

for i in range(2, num):
  if num % i == 0:
    divisors.append(i)

print(num,'의 진약수 :', divisors)
10 의 진약수 : [2, 5]
In [52]:
def get_divisors(num):   # num의 약수를 집합형으로 반환함
  divisors = set()
  for i in range(2, num):
    if num % i == 0:
      divisors.add(i)
  return divisors

x = 48
print(x,'의 진약수 :', get_divisors(x))
y = 60
print(y,'의 진약수 :', get_divisors(y))
48 의 진약수 : {2, 3, 4, 6, 8, 12, 16, 24}
60 의 진약수 : {2, 3, 4, 5, 6, 10, 12, 15, 20, 30}
In [53]:
A = get_divisors(x)
B = get_divisors(y)

print(A.intersection(B))
{2, 3, 4, 6, 12}
In [54]:
print(x, y,'의 최대공약수 :', max(A.intersection(B)))
48 60 의 최대공약수 : 12
In [ ]: