일반인을 위한 파이썬 지침서/사전
이 장은 사전에 관한 것이다. 사전은 키와 값을 가진다. 키는 값을 찾는데 사용된다. 여기에 사전이 사용되는 예제 하나가 있다.
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]'을 변경하는 것이기 때문이다.
사전은 키와 값들을 연결하는 쉬운 방법을 제공해 준다. 이것은 여러가지의 키에 연결되어 있는 데이타를 쉽게 추적하는데 사용될 수 있다.