일반인을 위한 파이썬 지침서/사전
이 장은 사전에 관한 것이다. 사전은 키와 값을 가진다. 키는 값을 찾는데 사용된다. 여기에 사전이 사용되는 예제 하나가 있다.
def print_menu(): print '1. Print Phone Numbers' print '2. Add a Phone Number' print '3. Remove a Phone Number' print '4. Lookup a Phone Number' print '5. Quit' print numbers = {} menu_choice = 0 print_menu() while menu_choice != 5: menu_choice = input("Type in a number (1-5):") if menu_choice == 1: print "Telephone Numbers:" for x in numbers.keys(): print "Name: ",x," \tNumber: ",numbers[x] print elif menu_choice == 2: print "Add Name and Number" name = raw_input("Name:") phone = raw_input("Number:") numbers[name] = phone elif menu_choice == 3: print "Remove Name and Number" name = raw_input("Name:") if numbers.has_key(name): del numbers[name] else: print name," was not found" elif menu_choice == 4: print "Lookup Number" name = raw_input("Name:") if numbers.has_key(name): print "The number is",numbers[name] else: print name," was not found" elif menu_choice != 5: print_menu()
그리고 여기에 나의 출력을 보인다면 다음과 같다.
1. Print Phone Numbers 2. Add a Phone Number 3. Remove a Phone Number 4. Lookup a Phone Number 5. Quit Type in a number (1-5):2 Add Name and Number Name:Joe Number:545-4464 Type in a number (1-5):2 Add Name and Number Name:Jill Number:979-46^H54 Type in a number (1-5):2 Add Name and Number Name:Fred Number:132-9874 Type in a number (1-5):1 Telephone Numbers: Name: Jill Number: 979-454 Name: Joe Number: 545-4464 Name: Fred Number: 132-9874 Type in a number (1-5):4 Lookup Number Name:Joe The number is 545-4464 Type in a number (1-5):3 Remove Name and Number Name:Fred Type in a number (1-5):1 Telephone Numbers: Name: Jill Number: 979-454 Name: Joe Number: 545-4464 Type in a number (1-5):5
이 프로그램은 리스트에 관한 전 장에서의 'name' 리스트와 비슷하다. 여기에 그 프로그램이 어떻게 작동하는 지를 보인다. 먼저 print_menu가 정의 된다. print_menu 는 단지 메뉴를 출력할 뿐으로 프로그램에서 나중에 두 번 사용된다. 다음에는 우스꽝스럽게 보이는 'numbers = {}' 라인이 온다. 이 라인이 하는 모든 일은 파이썬에게 numbers 가 사전이라고 알려 주는 것이다. 다음의 라인들은 단지 메뉴가 작동하도록 하는 것이다. 다음의 라인은
for x in numbers.keys(): print "Name: ",x," \tNumber: ",numbers[x]
사전을 순회하면서 모든 정보들을 출력한다. numbers.keys() 함수는 이제 for 회돌이에 의해 사용되는 리스트 하나를 반환한다. keys 가 반환한 리스트는 어떤 특별한 순서가 없으므로 여러분이 알파벳순을 원한다면 그것을 정렬해야만 한다. 리스트와 비슷하게 numbers[x] 는 사전에 있는 특별한 구성원에 접근하는데 사용된다. 물론 이 경우에 x 는 문자열이다. 다음으로 'numbers[name] = phone' 라인은 이름과 전화번호를 그 사전에 추가한다. 만약 name 이 이미 사전에 있다면 phone 은 그전에 있었던 값을 대체할 것이다. 다음의 라인은
if numbers.has_key(name): del numbers[name]
사전에 name이 있는지 살펴본다. 그리고 그것이 존재한다면 제거한다. numbers.has_key(name) 함수는 name이 numbers 속에 있다면 참값을 그렇지 않으면 거짓을 반환한다. 'del numbers[name]'라인은 name키와 그와 관련된 값을 제거한다. 다음의 라인은:
if numbers.has_key(name): print "The number is",numbers[name]
사전이 어떤키를 가지고 있는지 점검하고 만약 그렇다면 그것과 관련된 숫자를 출력한다. 마지막으로 메뉴선택이 무효하다면 여러분의 눈을 편하게 하기 위해 메뉴를 다시 출력한다.
요 약: 사전은 키와 값들을 가진다. 키는 문자열 혹은 숫자일 수 있다. 키는 값을 지시한다. 값은 어떠한 형태의 변수라도 가능하다.(리스트 혹은 사전까지도 포함하여 (그러한 사전이나 리스트는 물론 사전이나 리스트 자신들을 포함할 수 있다.( 거의 맞겄지요?:)) 여기에 사전에서 리스트를 사용하는 예제 하나가 있다.
max_points = [25,25,50,25,100] assignments = ['hw ch 1','hw ch 2','quiz ','hw ch 3','test'] students = {'#Max':max_points} def print_menu(): print "1. Add student" print "2. Remove student" print "3. Print grades" print "4. Record grade" print "5. Print Menu" print "6. Exit" def print_all_grades(): print '\t', for i in range(len(assignments)): print assignments[i],'\t', print keys = students.keys() keys.sort() for x in keys: print x,'\t', grades = students[x] print_grades(grades) def print_grades(grades): for i in range(len(grades)): print grades[i],'\t\t', print print_menu() menu_choice = 0 while menu_choice != 6: print menu_choice = input("Menu Choice (1-6):") if menu_choice == 1: name = raw_input("Student to add:") students[name] = [0]*len(max_points) elif menu_choice == 2: name = raw_input("Student to remove:") if students.has_key(name): del students[name] else: print "Student: ",name," not found" elif menu_choice == 3: print_all_grades() elif menu_choice == 4: print "Record Grade" name = raw_input("Student:") if students.has_key(name): grades = students[name] print "Type in the number of the grade to record" print "Type a 0 (zero) to exit" for i in range(len(assignments)): print i+1,' ',assignments[i],'\t', print print_grades(grades) which = 1234 while which != -1: which = input("Change which Grade:") which = which-1 if 0 <= which < len(grades): grade = input("Grade:") grades[which] = grade elif which != -1: print "Invalid Grade Number" else: print "Student not found" elif menu_choice != 6: print_menu()
그리고 여기에 샘플 출력이 있다.
1. Add student 2. Remove student 3. Print grades 4. Record grade 5. Print Menu 6. Exit Menu Choice (1-6):3 hw ch 1 hw ch 2 quiz hw ch 3 test #Max 25 25 50 25 100 Menu Choice (1-6):6 1. Add student 2. Remove student 3. Print grades 4. Record grade 5. Print Menu 6. Exit Menu Choice (1-6):1 Student to add:Bill Menu Choice (1-6):4 Record Grade Student:Bill Type in the number of the grade to record Type a 0 (zero) to exit 1 hw ch 1 2 hw ch 2 3 quiz 4 hw ch 3 5 test 0 0 0 0 0 Change which Grade:1 Grade:25 Change which Grade:2 Grade:24 Change which Grade:3 Grade:45 Change which Grade:4 Grade:23 Change which Grade:5 Grade:95 Change which Grade:0 Menu Choice (1-6):3 hw ch 1 hw ch 2 quiz hw ch 3 test #Max 25 25 50 25 100 Bill 25 24 45 23 95 Menu Choice (1-6):6
여기에 그 프로그램이 동작하는 법을 보인다. 기본적으로 변수 students 는 학생의 이름을 키로 그들의 학년을 값으로 가지는 사전이다. 첫 번째의 두 라인은 단지 두 개의 리스트를 생성한다. 다음의 라인 'students = {'#Max':max_points}'은 #Max를 키로 하는 새로운 사전을 생성한다. 그리고 그 값을 [25,25,50,25,100] 으로 설정한다. (그것이 할당이 이루어 질때의 'max_points' 값들이므로) (알파벳문자중 어떤 것보다도 앞에 정렬되므로 나는 키'#Max'를 사용한다.) 다음으로 print_menu 가 정의 된다. 다음으로 print_all_grades 함수가 이 라인에서 정의된다.
def print_all_grades(): print '\t', for i in range(len(assignments)): print assignments[i],'\t', print keys = students.keys() keys.sort() for x in keys: print x,'\t', grades = students[x] print_grades(grades)
먼저 'keys = students.keys() '에서 keys함수를 가지고 students 사전으로 부터 어떻게 키를 획득하는지 주목하라. keys는 하나의 리스트이다 그래서 리스트를 위한 모든 함수가 그것에 사용될 수 있다. 다음으로 그 키는 리스트이므로 다음의 라인 'keys.sort()'에서 정렬된다. 'for'문은 모든 키들을 방문하는데 사용된다. 학년은 사전안에서 리스트의 형태로 저장되어서 할당문 는 grades 에게 키 x 에 저장된 리스트를 넘겨 줄 수 있다. 함수 print_grades는 단지 리스트를 출력하기만 한다 그리고 몇 라인 뒤에서 정의 된다.
프로그램의 이후의 라인들은 메뉴의 다양한 선택사항들을 구현한다. 라인 'students[name] = [0]*len(max_points)'는 한 학생을 그들의 이름으로 이루어진 키에 추가한다. 다음의 표기법 '[0]*len(max_points)'은 단순히 0 으로 이루어진 배열 하나를 생성하는데 max_points 리스트와 같은 길이이다.
제거된 학생의 항목은 전화번호부 예에서와 비슷하게 단지 학생을 지우기만 한다. 학년 선택 레코드는 약간은 좀 더 복잡하다. 학년은 'grades = students[name]'라인에서 검색되어서 name학생의 학년에 대한 참조를 획득한다. 그리고 나서 학년은 'grades[which] = grade'라인에서 기록된다. 여러분은 'grades' 가 다시 학생 사전으로 되 돌려 입력 되지 않는다는 것을 주목하라.( 다음과 같이 'students[name] = grades' 불가이다.). 그 문장이 잘못된 이유는 grades 가 실제로는 students[name] 의 다른 이름이기 때문이고 그러므로 grades를 변경하는 것은 'student[name]'을 변경하는 것이기 때문이다.
사전은 키와 값들을 연결하는 쉬운 방법을 제공해 준다. 이것은 여러가지의 키에 연결되어 있는 데이타를 쉽게 추적하는데 사용될 수 있다.