생능출판사 (가칭)"데이터과학 파이썬" 코드 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 [ ]: