일반인을 위한 파이썬 지침서/사전

이 장은 사전에 관한 것이다. 사전은 키와 값을 가진다. 키는 값을 찾는데 사용된다. 여기에 사전이 사용되는 예제 하나가 있다.

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]'을 변경하는 것이기 때문이다.

사전은 키와 값들을 연결하는 쉬운 방법을 제공해 준다. 이것은 여러가지의 키에 연결되어 있는 데이타를 쉽게 추적하는데 사용될 수 있다.