프로그램에서자료들을저장하는여러가지구조들이있다. 이를자료구조 (data structure) 라부른다.
시퀀스에속하는자료구조들은동일한연산을지원한다. 인덱싱 (indexing), 슬라이싱 (slicing), 덧셈연산 (adding), 곱셈연산 (multiplying) 리스트는앞에서자세하게살펴본바있다. 여기서는나머지시퀀스들을탐구해보자.
튜플 (tuple) 은변경될수없는리스트 >>> colors = ("red", "green", "blue") >>> colors ('red', 'green', 'blue') >>> numbers = (1, 2, 3, 4, 5 ) >>> numbers (1, 2, 3, 4, 5)
>>> t1 = (1, 2, 3, 4, 5); >>> t1[0] = 100; Traceback (most recent call last): File "<pyshell#11>", line 1, in <module> t1[0]=100 TypeError: 'tuple' object does not support item assignment >>> numbers = ( 1, 2, 3, 4, 5 ) >>> colors = ("red", "green", "blue") >>> t = numbers + colors >>> t (1, 2, 3, 4, 5, 'red', 'green', 'blue')
>>> student1 = (" 철수 ", 19, "CS") >>> (name, age, major) = student1 >>> name ' 철수 ' >>> age 19 >>> major 'CS
원의넓이와둘레를동시에반환하는함수를작성, 테스트해보자. 원의반지름을입력하시오 : 10 원의넓이는 314.1592653589793 이고원의둘레는 62.83185307179586 이다.
import math def calcircle(r): # 반지름이 r 인원의넓이와둘레를동시에반환하는함수 (area, circum) area = math.pi * r * r circum = 2 * math.pi * r return (area, circum) radius = float(input(" 원의반지름을입력하시오 : ")) (a, c) = calcircle(radius) print(" 원의넓이는 "+str(a)+" 이고원의둘레는 "+str(c)+" 이다.")
세트 (set) 는우리가수학에서배웠던집합이다. 세트는중복되지않은항목들이모인것 세트의항목간에는순서가없다.
>>> numbers = {2, 1, 3} >>> numbers {1, 2, 3} >>> len(numbers) 3 >>> fruits = { "Apple", "Banana", "Pineapple" } >>> myset = { 1.0, 2.0, "Hello World", (1, 2, 3) }
>>> numbers = {2, 1, 3} >>> if 1 in numbers: print(" 집합안에 1 이있습니다.") 집합안에 1 이있습니다. >>> numbers = {2, 1, 3} >>> for x in numbers: print(x, end=" ") 1 2 3
>>> numbers = { 2, 1, 3 } >>> numbers[0]... TypeError: 'set' object does not support indexing >>> numbers.add(4) >>> numbers {1, 2, 3, 4}
>>> A = {1, 2, 3} >>> B = {1, 2, 3} >>> A == B True >>> A = {1, 2, 3, 4, 5} >>> B = {1, 2, 3} >>> B < A True >>> A = {1, 2, 3, 4, 5} >>> B = {1, 2, 3} >>> B.issubset(A) True
>>> A = {1, 2, 3} >>> B = {3, 4, 5} >>> A B {1, 2, 3, 4, 5} >>> A & B {3} >>> A - B {1, 2}
파티에참석한사람들의명단이세트 A 와 B 에각각저장되어있다. 2 개파티에모두참석한사람들의명단을출력하려면어떻게해야할까? 2 개의파티에모두참석한사람은다음과같습니다. {'Park'}
partya = set(["park", "Kim", "Lee"]) partyb = set(["park", "Choi"]) print("2 개의파티에모두참석한사람은다음과같습니다. ") print ( partya.intersection(partyb))
텍스트파일을읽어서단어를얼마나다양하게사용하여문서를작성하였는지를계산하는프로그램을작성해보자. 입력파일이름 : proverbs.txt 사용된단어의개수 = 18 {'travels', 'half', 'that', 'news', 'alls', 'well', 'fast', 'feather', 'flock', 'bad', 'together', 'ends', 'is', 'a', 'done', 'begun', 'birds', 'of'}
# 단어에서구두점을제거하고소문자로만든다. 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)
딕셔너리는키 (key) 와값 (value) 의쌍을저장할수있는객체
>>> contacts = {'Kim':'01012345678', 'Park':'01012345679', 'Lee':'01012345680' } >>> contacts {'Kim': '01012345678', 'Lee': '01012345680', 'Park': '01012345679'}
>>> contacts = {'Kim':'01012345678', 'Park':'01012345679', 'Lee':'01012345680' } >>> contacts['kim'] '01012345678 >>> contacts.get('kim') '01012345678' >>> if "Kim" in contacts: print(" 키가딕셔너리에있음 ")
>>> contacts['choi'] = '01056781234' >>> contacts {'Kim': '01012345678', 'Choi': '01056781234', 'Lee': '01012345680', 'Park': '01012345679'} >>> contacts = {'Kim':'01012345678', 'Park':'01012345679', 'Lee':'01012345680' } >>> contacts.pop("kim") '01012345678' >>> contacts {'Lee': '01012345680', 'Park': '01012345679'}
>>> scores = { 'Korean': 80, 'Math': 90, 'English': 80} >>> for item in scores.items(): print(item) ('Math', 90) ('English', 80) ('Korean', 80) >>>
우리는영한사전을구현하여보자. 어떻게하면좋은가? 공백딕셔너리를생성하고여기에영어단어를키로하고설명을값으로하여저장하면될것이다. 단어를입력하시오 : one 하나 단어를입력하시오 : python 없음
english_dict = dict() english_dict['one'] = ' 하나 ' english_dict['two'] = ' 둘 ' english_dict['three'] = ' 셋 ' word = input(" 단어를입력하시오 : "); print (english_dict.get(word, " 없음 "))
사용자가지정하는파일을읽어서파일에저장된각각의단어가몇번이나나오는지를계산하는프로그램을작성하여보자. 파일이름 : proverbs.txt {'a': 1, 'done.': 1, 'that': 1, 'well.': 1, 'ends': 1, 'Well': 1, 'flock': 1, 'feather': 1, "All's": 1, 'Birds': 1, 'together.': 1, 'of': 1, 'fast.': 1, 'begun': 1, 'half': 1, 'well': 1, 'travels': 1, 'news': 1, 'is': 1, 'Bad': 1}
fname = input(" 파일이름 : ") file = open(fname, "r") table = dict() for line in file: words = line.split() for word in words: if word not in table: table[word] = 1 else: table[word] += 1 print(table)
현대인들은축약어를많이사용한다. 예를들어서 "B4(Before)" "TX(Thanks)" "BBL(Be Back Later)" "BCNU(Be Seeing You)" "HAND(Have A Nice Day)" 와같은축약어들이있다. 축약어를풀어서일반적인문장으로변환하는프로그램을작성하여보자. 번역할문장을입력하시오 : TX Mr. Park! Thanks Mr.Park!
table = { "B4": "Before", "TX": "Thanks", "BBL": "Be Back Later", "BCNU":"Be Seeing You", "HAND":"Have A Nice Day" } message = input(' 번역할문장을입력하시오 : ') words = message.split() result = "" for word in words: if word in table: result += table[word] + " " else: result += word print(result)
문자열은문자들의시퀀스로정의된다. 글자들이실 (string) 로묶여있는것이문자열이라고생각하면된다.
s1 = str("hello") s2 = "Hello s1 = "Hello" s2 = "World" s3 = "Hello"+"World"
>>> word = 'abcdef' >>> word[0] 'a' >>> word[5] 'f'
>>> word = 'Python' >>> word[0:2] 'Py' >>> word[2:5] 'tho
>>> word = 'Python' >>> word[0:2] 'Py' >>> word[2:5] 'tho
>>> s="love will find a way." >>> "Love" in s True >>> "love" in s False s = input(" 문자열을입력하시오 ") if 'c' in s: print('c 가포함되어있음 ') else: print('c 가포함되어있지않음 ')
a = input(" 문자열을입력하시오 : ") b = input(" 문자열을입력하시오 : ") if( a < b ): print(a, " 가앞에있음 ") else: print(b, " 가앞에있음 ") 문자열을입력하시오 : apple 문자열을입력하시오 : orange apple 가앞에있음
>>> s = 'Never put off till tomorrow what you can do today.' >>> s.split() ['Never', 'put', 'off', 'till', 'tomorrow', 'what', 'you', 'can', 'do', 'today.']
회문 (palindrome) 은앞으로읽으나뒤로읽으나동일한문장이다. 예를들어서 "mom", "civic", "dad" 등이회문의예이다. 사용자로부터문자열을입력받고회문인지를검사하는프로그램을작성하여보자. 문자열을입력하시오 : dad 회문입니다.
def check_pal(s): low = 0 high = len(s) - 1 while True: if low > high: return True; a = s[low] b = s[high] if a!= b: return False low += 1 high -= 1 s = input(" 문자열을입력하시오 : ") s = s.replace(" ", "") if( check_pal(s)==true): print(" 회문입니다.") else: print(" 회문이아닙니다.")
머리글자어 (acronym) 은 NATO(North Atlantic Treaty Organization) 처럼각단어의첫글자를모아서만든문자열이다. 사용자가문장을입력하면해당되는머리글자어를출력하는프로그램을작성하여보자. 문자열을입력하시오 : North Atlantic Treaty Organization NATO
phrase = input(" 문자열을입력하시오 : ") acronym = "" for word in phrase.upper().split(): acronym += word[0] print( acronym )
CSV 파일은 split() 메소드를이용하여파싱될수있다. open(), readlines(), strip() 메소드를사용하여서다음과같은 CSV 파일에서데이터를읽는프로그램을작성하여보자. 홍길동,2018, 생활관 A,312,3.18 홍길동 2018 생활관 A 312 3.18 김철수,2017, 생활관 B,102,3.25 김철수 2017 생활관 B 102 3.25
# 파일을오픈한다. f = open("e:\\students.txt", "r") # 파일의각줄에대하여반복한다. for line in f.readlines(): # 공백문자를제거한다. line = line.strip() # 줄을출력한다. print(line) # 줄을단어로분리한다. words = line.split(",") # 줄의단어를출력한다. for word in words: print(" ", word)
문자열안에있는문자의개수, 숫자의개수, 공백의개수를계산하는프로그램을작성하여보자. 문자열을입력하시오 : A picture is worth a thousand words. {'digits': 0, 'spaces': 6, 'alphas': 29}
sentence = input(" 문자열을입력하시오 : ") table = { "alphas": 0, "digits":0, "spaces": 0 } for i in sentence: if i.isalpha(): table["alphas"] += 1 if i.isdigit(): table["digits"] += 1 if i.isspace(): table["spaces"] += 1 print(table)
튜플은리스트와유사하지만변경할수없는객체이다. 세트는집합으로요소들은중복되지않아야한다. 딕셔너리는사전으로키와값의쌍으로저장된다. 키를이용하여값을찾을수있다.