본문으로 이동

일반인을 위한 파이썬 지침서/리스트

위키책, 위키책

하나 이상의 값을 가지는 변수

[+/-]

여러분은 이미 하나의 값을 담고 있는 일상적이 변수들을 보아 왔다. 그렇지만, 다른 변수형태들은 하나 이상의 값을 가질 수 있다. 가장 단순한 형태는 리스트라고 불린다. 여기에 리스트가 사용되는 예를 보인다.

which_one = input("What month (1-12)? ")
months = ['January', 'February', 'March', 'April', 'May', 'June', 'July',\
	'August', 'September', 'October', 'November', 'December']
if 1 <= which_one <= 12:
        print "The month is",months[which_one - 1]

그리고 출력의 예는 다음과 같다.

What month (1-12)? 3
The month is March

이 예에서 months가 리스트이다. months는 라인 months = ['January', 'February', 'March', 'April', 'May', 'June', 'July',\ 'August', 'September', 'October', 'November', 'December']로 정의 된다. (\가 기다란 라인을 나누는데 사용될 수 있음을 주목하라.) [ 와 ]는 각각 시작과 끝이며 컴마(``,)로 리스트의 항목들을 분리한다. 리스트는 'months[which_one - 1]'에서 사용된다. 리스트는 0에서 시작하는 항목들로 구성된다. 다른 말로 하면, 여러분이 1월달을 원한다면 여러분은 months[0]를 사용할 수 있다. 리스트에 숫자 하나를 주어라 그러면 그 위치에 저장된 값을 돌려 줄 것이다.

서술문 'if 1 <= which_one <= 12:'는 which_one이 1과 12 사이에 포함될 때만 오직 참이 될 것이다. (다른 말로 하면, 여러분이 대수학에서 그것을 보았다면 당연히 그것이 여러분이 예상한 바이다.)

리스트를 일련의 상자로 생각할 수도 있다. 예를 들어, 'demolist = ['life',42, 'the universe', 6,'and',7]'에 의하여 생성되어진 상자들은 다음과 같이 보일 것이다.

box number 0 1 2 3 4 5
demolist `life' 42 `the universe' 6 `and' 7

각 상자들은 그 숫자에 의해 참조되어서 서술문 demolist[0]는 'life'를, demolist[1]은 42를 획득하게 되고, 그런식으로 demolist[5]는 7를 획득하게 된다.

리스트의 더 자세한 사양

[+/-]

다음의 예제는 리스트들이 할 수 있는, 많은 다른 것들을 단지 보여주기 위한 것이다.(여러분이 이것을 타이프해 넣기를 예상하지는 않겠지만, 그러나 여러분은 리스트에 편안함을 느낄 때까지 그것들을 가지고 놀아야만 할 것이다.) 자 가보자.

demolist = ['life',42, 'the universe', 6,'and',7]
print 'demolist = ',demolist
demolist.append('everything')
print "after 'everything' was appended demolist is now:"
print demolist
print 'len(demolist) =', len(demolist)
print 'demolist.index(42) =',demolist.index(42)
print 'demolist[1] =', demolist[1]
#Next we will loop through the list
c = 0
while c < len(demolist):
    print 'demolist[',c,']=',demolist[c]
    c = c + 1
del demolist[2]
print "After 'the universe' was removed demolist is now:"
print demolist
if 'life' in demolist:
    print "'life' was found in demolist"
else:
    print "'life' was not found in demolist"
if 'amoeba' in demolist:
    print "'amoeba' was found in demolist"
if 'amoeba' not in demolist:
    print "'amoeba' was not found in demolist"
demolist.sort()
print 'The sorted demolist is ',demolist

그 출력은 다음과 같다.

demolist =  ['life', 42, 'the universe', 6, 'and', 7]
after 'everything' was appended demolist is now:
['life', 42, 'the universe', 6, 'and', 7, 'everything']
len(demolist) = 7
demolist.index(42) = 1
demolist[1] = 42
demolist[ 0 ]= life
demolist[ 1 ]= 42
demolist[ 2 ]= the universe
demolist[ 3 ]= 6
demolist[ 4 ]= and
demolist[ 5 ]= 7
demolist[ 6 ]= everything
After 'the universe' was removed demolist is now:
['life', 42, 6, 'and', 7, 'everything']
'life' was found in demolist
'amoeba' was not found in demolist
The sorted demolist is  [6, 7, 42, 'and', 'everything', 'life']

이 예제는 새로운 함수를 무더기로 사용하고 있다. 여러분은 전체 리스트를 단지 출력 print할 수만 있음을 주의하라. 다음으로 append 함수는 리스트의 끝이 새로운 항목 하나를 더하는데 사용되어진다. len 함수는 리스트에 얼마나 많은 항목이 있는지를 돌려준다. The index 함수는 항목의 위치가 리스트에서 어디인지를 말해준다. 'demolist.index(42)' 가 1을 돌려주고 demolist[1] 가 실행되면 42를 돌려준다는 것을 주목하라. '#Next we will loop through the list'라인은 프로그래머에게는 단지 여분이다( 또한 주석이라고도 부른다). 파이썬은 #로 시작하는 모든 라인을 무시할 것이다. 다음의 라인은

c = 0
while c < len(demolist):
    print 'demolist[',c,']=',demolist[c]
    c = c + 1

0에서 시작해서 리스트의 마지막 지표에 도달할 때까지 증가하는 하나의 변수 c 를 만든다. 그동안 print서술문은 그 리스트의 각 요소를 출력한다.

del명령어는 리스트에서 주어진 요소를 제거하는데에 사용된다. 다음의 라인 몇줄은 in 연산자를 사용하여 하나의 요소가 리스트에 포함되었는지 아닌지를 테스트한다.

이 예제는 이러한 사양을 더 유용하게 사용한다.

menu_item = 0
list = []
while menu_item != 9:
        print "--------------------"
        print "1. Print the list"
        print "2. Add a name to the list"
        print "3. Remove a name from the list"
        print "4. Change an item in the list"
        print "9. Quit"
        menu_item = input("Pick an item from the menu: ")
        if menu_item == 1:
                current = 0
                if len(list) > 0:
                        while current < len(list):
                                print current,". ",list[current]
                                current = current + 1
                else:
                        print "List is empty"
        elif menu_item == 2:
                name = raw_input("Type in a name to add: ")
                list.append(name)
        elif menu_item == 3:
                del_name = raw_input("What name would you like to remove: ")
                if del_name in list:
                        item_number = list.index(del_name)
                        del list[item_number]
                else:
                        print del_name," was not found"
        elif menu_item == 4:
                old_name = raw_input("What name would you like to change: ")
                if old_name in list:
                        item_number = list.index(old_name)
                        new_name = raw_input("What is the new name: ")
                        list[item_number] = new_name
                else:
                        print old_name," was not found"
print "Goodbye"

그리고 여기에 출력의 일부가 있다.

--------------------
1. Print the list
2. Add a name to the list
3. Remove a name from the list
4. Change an item in the list
9. Quit

Pick an item from the menu: 2
Type in a name to add: Jack

Pick an item from the menu: 2
Type in a name to add: Jill

Pick an item from the menu: 1
0 .  Jack
1 .  Jill

Pick an item from the menu: 3
What name would you like to remove: Jack

Pick an item from the menu: 4
What name would you like to change: Jill
What is the new name: Jill Peters

Pick an item from the menu: 1
0 .  Jill Peters

Pick an item from the menu: 9
Goodbye

긴 프로그램이다. 소스코드를 한번 살펴보자. 라인 'list = []'는 변수list를 아무런 항목(혹은 요소)도 같지 않는 리스트로 만든다. 다음의 중요한 라인은 while menu_item != 9:이다. 이 라인은 이 프로그램을 위한 메뉴시스템을 가능하게 해주는 회돌이를 시작한다. 다음의 라인 몇개는 메뉴를 보여주고, 프로그램의 어떤 부분이 실행될지를 결정한다.

다음의 코드는

current = 0
if len(list) > 0:
        while current < len(list):
                print current,". ",list[current]
                current = current + 1
else:
        print "List is empty"

리스트를 순회하면서 각각의 이름을 출력한다. len(list_name)는 리스트에 얼마나 많은 항목이 있는지 알려준다. len 함수가 0 을 반환하면 리스트는 비어 있는 것이다.

그리고 나서 몇개의 라인 뒤에 서술문 'list.append(name)'가 나타난다. 그것은 append함수를 사용하여 리스트의 끝에다가 한개의 항목을 추가한다. 아래의 두개 라인으로 점프하라. 이 코드의 부분은 다음과 같다.

item_number = list.index(del_name)
del list[item_number]

여기에서 index함수가 사용되어 그 항목을 제거하기 위하여 나중에 사용하게 될 지표값을 탐색한다. 'del list[item_number]'는 리스트에서 한개의 항목을 제거하기 위하여 사용된다.

다음 부분은

old_name = raw_input("What name would you like to change: ")
if old_name in list:
        item_number = list.index(old_name)
        new_name = raw_input("What is the new name: ")
        list[item_number] = new_name
else:
        print old_name," was not found"

'index'를 사용하여 item_number를 탐색해서 old_name 이 있었던 곳에 new_name를 놓는다.

예제들

[+/-]
# test.py

## This program runs a test of knowledge

true = 1
false = 0

# First get the test questions
# Later this will be modified to use file io.
def get_questions():
    # notice how the data is stored as a list of lists
    return [["What color is the daytime sky on a clear day?","blue"],\
            ["What is the answer to life, the universe and everything?","42"],\
            ["What is a three letter word for mouse trap?","cat"]]

# This will test a single question
# it takes a single question in
# it returns true if the user typed the correct answer, otherwise false
def check_question(question_and_answer):
    #extract the question and the answer from the list
    question = question_and_answer[0]
    answer = question_and_answer[1]
    # give the question to the user
    given_answer = raw_input(question)
    # compare the user's answer to the testers answer
    if answer == given_answer:
        print "Correct"
        return true
    else:
        print "Incorrect, correct was:",answer
        return false

# This will run through all the questions
def run_test(questions):
    if len(questions) == 0:
        print "No questions were given."
        # the return exits the function
        return
    index = 0
    right = 0
    while index < len(questions):
        #Check the question
        if check_question(questions[index]):
            right = right + 1
        #go to the next question
        index = index + 1
    #notice the order of the computation, first multiply, then divide
    print "You got ",right*100/len(questions),"% right out of",len(questions)

#now lets run the questions
run_test(get_questions())

샘플 출력은 다음과 같다.

What color is the daytime sky on a clear day?green
Incorrect, correct was: blue
What is the answer to life, the universe and everything?42
Correct
What is a three letter word for mouse trap?cat
Correct
You got  66 % right out of 3