12. 자료 구조

자료 구조란 간단하게, 어떤 '자료'를 담는 '구조'를 말합니다. 다른 말로 하면, 서로 연관이 있는 어떤 자료의 집합을 저장하는 데 사용된다고 할 수 있습니다.

파이썬에는 리스트, 튜플, 사전, 집합 총 네 종류의 자료 구조가 있습니다. 이 장에서는 이 네 가지 자료 구조를 살펴봅니다.


12.1 리스트

리스트란 순서대로 정리된 항목을 담고 있는 자료 구조입니다. 즉, 리스트에는 항목의 '목록'을 저장할 수 있습니다. 이것은 쉽게 말하자면 장 보러 갈 때 적는 일종의 장바구니 목록 같은 것인데, 아마도 여러분은 각 품목을 한줄 한줄로 적겠지만 파이썬에서는 쉼표로 각 항목을 구분합니다.

리스트를 정의할 때는 대괄호 []를 이용해서 파이썬에게 이것이 리스트임을 알려 줍니다. 한번 리스트를 만들면 새로운 항목을 추가하거나 삭제할 수 있으며, 특정 항목이 존재하는지 검색할 수도 있습니다. 이때 항목을 추가 및 삭제가 가능하다는 것을 '비정적mutable'이라고 하며, 리스트는 비정적 자료구조로 내부 항목을 변경할 수 있습니다.


12.2 객체와 클래스에 대한 간단한 소개

객체와 클래스에 대해서는 좀 더 나중에 다루겠지만, 여기서 여러분이 리스트에 대해 좀 더 잘 이해할 수 있도록 간단히만 소개하겠습니다. 더 자세한 설명은 14. 객체 지향 프로그래밍에서 하겠습니다.

리스트는 객체와 클래스가 사용된 것이라고 할 수 있습니다.  예를 들어 변수 i를 선언하고 5라는 값을 할당하는 것은, int라는 클래스(또는 타입)의 객체(또는 인스턴스) i를 만드는 것입니다. 더 궁금하다면 help(int)를 읽어보기 바랍니다.

클래스는 '메소드'를 가질 수 있습니다. 여기서 메소드란 그 클래스 내에 정의된 고유의 내장 함수를 말합니다. 내장 함수는 클래스로 객체를 생성해야 비로소 사용할 수 있습니다. 예를 들어, 파이썬은 list 클래스에 append라는 메소드를 제공합니다. 이 메소드는 리스트의 마지막에 항목을 한 개 추가할 때 사용됩니다. 즉 mylist.append('an item')라 하면 리스트 mylist의 마지막에 해당 문자열을 추가합니다. 이때 객체의 메소드에 접근할 때에도 마침표를 이용한다는 점을 기억하세요.

또 클래스는 '필드'를 가질 수 있는데, 이것은 단순히 그 클래스 내에 정의된 변수를 의미합니다. 메소드와 마찬가지로 이러한 변수는 클래스로 객체를 생성해야 비로소 사용할 수 있습니다. 필드도 메소드와 마찬가지로 마침표를 이용하여 접근합니다. 예를 들면 mylist.field와 같습니다.


https://github.com/swaroopch/byte-of-python/blob/master/programs/ds_using_list.py

# This is my shopping list
shoplist = ['apple', 'mango', 'carrot', 'banana']

print 'I have', len(shoplist), 'items to purchase.'

print 'These items are:',
for item in shoplist:
    print item,

print '\nI also have to buy rice.'
shoplist.append('rice')
print 'My shopping list is now', shoplist

print 'I will sort my list now'
shoplist.sort()
print 'Sorted shopping list is', shoplist

print 'The first item I will buy is', shoplist[0]
olditem = shoplist[0]
del shoplist[0]
print 'I bought the', olditem
print 'My shopping list is now', shoplist
ds_using_list.py(이 코드를 ds_using_list.py로 저장하세요)

실행 결과는 다음과 같습니다.

$ python ds_using_list.py
I have 4 items to purchase.
These items are: apple mango carrot banana
I also have to buy rice.
My shopping list is now ['apple', 'mango', 'carrot', 'banana', 'rice']
I will sort my list now
Sorted shopping list is ['apple', 'banana', 'carrot', 'mango', 'rice']
The first item I will buy is apple
I bought the apple
My shopping list is now ['banana', 'carrot', 'mango', 'rice']


여러분이 장 보러 갈 때 장바구니 목록을 변수 shoplist에 담아 두었다고 합시다. shoplist에는, 구매할 항목의 이름 문자열이 담겨 있습니다. 그런데 리스트에는 '어떤 종류의 객체'든지 담을 수 있으며 숫자라든지, 심지어는 리스트 안에 리스트를 담을 수도 있습니다.

여기서는 for..in 반복문을 사용하여 리스트 안에 담긴 항목을 하나씩 반복하여 읽어왔습니다. 지금쯤 여러분은 리스트가 하나의 열거 형식임을 이해했을 것입니다. 열거 형식의 특수성에 대해서는 12.5 열거형에서에서 다루겠습니다.

print 문 맨 뒤에 추가한 쉼표는 출력될 내용 뒤에 줄바꿈 기호 대신 공백을 출력하도록 지정한 것입니다. 쉼표는 파이썬에게 앞으로 출력될 내용을 같은 줄에 이어서 출력하라고 알리는 것입니다.

다음으로, 앞서 설명했던 리스트 객체의 append 메소드를 이용해서 리스트에 항목을 한 개 추가합니다. 그리고, 추가된 항목이 제대로 추가되었는지 확인하기 위해 print 문에 리스트를 넘겨 리스트 내용을 화면에 출력했습니다.

이제 리스트의 sort 메소드를 이용하여 리스트의 내용을 정렬합니다. 여기서 이 메소드는 해당 리스트 자체를 변화시키며 수정된 리스트를 또 반환해주지 않는데 이를 이해하는 게 무척 중요합니다. 즉, '정적'인 문자열과 달리 리스트는 바뀔 수 있는 성질을 지녔으며 이것을 '비정적'이라 합니다.

다음으로 시장에서 물건을 구매하면 이제 장바구니 목록에서 해당 항목을 지워야 합니다. 이때 del 문을 사용하여 항목을 삭제합니다. 항목을 삭제할 때는 어떤 항목을 지울지 del 문에 알리면 리스트에서 해당 항목이 삭제됩니다. 여기서는 del shoplist[0]이라고 입력하여 첫 번째 항목을 삭제할 것임을 알려 주었습니다 (파이썬은 숫자를 0부터 센다는 점을 기억하시기 바랍니다).

리스트 객체가 갖고 있는 모든 메소드에 대해 알고 싶다면, help(list)를 살펴보세요.


12.3 튜플

튜플은 여러 객체를 한 곳에 모아 담는 데 사용됩니다. 튜플은 리스트와 비슷하지만, 리스트 클래스에 있는 여러 기능이 없습니다. 또 튜플은 수정이 불가능합니다. 그래서 주로 문자열과 같이 '비정적'인 객체를 담을 때 사용합니다.

튜플은 생략할 수 있는 괄호로 묶인 쉼표로 구분된 여러 항목을 정의합니다. 튜플에 저장된 값은 수정이 불가능하기 때문에, 단순 값의 목록을 다루는 구문이나 사용자 정의 함수에 주로 사용됩니다.


https://github.com/swaroopch/byte-of-python/blob/master/programs/ds_using_tuple.py

# I would recommend always using parentheses
# to indicate start and end of tuple
# even though parentheses are optional.
# Explicit is better than implicit.
zoo = ('python', 'elephant', 'penguin')
print 'Number of animals in the zoo is', len(zoo)

new_zoo = 'monkey', 'camel', zoo
print 'Number of cages in the new zoo is', len(new_zoo)
print 'All animals in new zoo are', new_zoo
print 'Animals brought from old zoo are', new_zoo[2]
print 'Last animal brought from old zoo is', new_zoo[2][2]
print 'Number of animals in the new zoo is', \
    len(new_zoo)-1+len(new_zoo[2])
ds_using_tuple.py(이 코드를 ds_using_tuple.py로 저장하세요)

실행 결과는 다음과 같습니다.

$ python ds_using_tuple.py
Number of animals in the zoo is 3
Number of cages in the new zoo is 3
All animals in new zoo are ('monkey', 'camel', ('python', 'elephant', 'penguin'))
Animals brought from old zoo are ('python', 'elephant', 'penguin')
Last animal brought from old zoo is penguin
Number of animals in the new zoo is 5


변수 zoo는 여러 항목을 담고 있는 튜플입니다. 보시는 바와 같이 len 함수를 통해 튜플의 길이를 알아올 수 있습니다. 튜플은 열거형의 한 예입니다.

동물원zoo 안의 동물을 새로운 동물원으로 옮겨야 한다고 가정해 봅시다. 이를 위해 새로운 동물원 new_zoo 튜플에 원래 있던 동물과 함께 기존의 동물원에 있던 동물을 옮겨 옵니다. 다시 파이썬으로 돌아와서, 이와 같이 튜플 안에 튜플을 담아도 튜플의 성질을 잃지 않습니다.

리스트와 같이, 튜플 안에 있는 항목의 위치를 대괄호로 묶어 지정하면 각 항목에 접근할 수 있습니다. 이를 인덱싱 연산자라고 부릅니다. new_zoo의 세 번째 항목에 접근하려면 new_zoo[2]와 같이 입력하면 됩니다. 그런데 세 번째 항목은 튜플입니다. 이 튜플의 세 번째 항목에 접근하려면 new_zoo[2][2]와 같이 접근할 수 있습니다. 익숙해지면 쉽게 느껴질 것입니다.


NOTE

빈 튜플과 한 개짜리 빈 튜플은 괄호 안에 아무것도 적지 않고 myempty = ()와 같이 생성할 수 있습니다. 그러나, 항목 한 개만 담고 있는 튜플을 정의할 때는 주의해야 합니다. 이 경우 첫 번째 항목의 뒤에 쉼표를 붙여 파이썬에게 이것이 숫자 연산에 사용되는 괄호가 아니라 객체를 담는 튜플이라고 알려줘야 합니다. 예를 들어, 항목 2를 담고 있는 튜플은 singleton = (2 , )와 같이 생성할 수 있습니다.


NOTE

펄 프로그래머를 위한 리스트 안의 리스트는 리스트의 성질을 잃지 않습니다. 리스트는 펄에서처럼 flatten되지 않습니다. 이 성질은 튜플 안의 튜플이나 리스트 안의 튜플 혹은 튜프 안의 리스트의 경우 모두에 적용됩니다. 파이썬에서는 이들은 단지 다른 객체 안에 저장된 객체일 뿐입니다.



12.4 사전

사전은, 이를테면 전화번호부 같은 것입니다. 누군가의 이름을 찾으면 그 사람의 주소와 연락처를 알 수 있죠. 이때 그 사람의 이름에 해당하는 것을 라 부르고, 주소와 연락처 등에 해당하는 것을 이라 합니다. 전화번호부에 동명이인이 있을 경우 어떤 정보가 맞는지 알 수 없듯 사전의 키는 사전에서 유일한 값이어야 합니다.

사전의 키는 정적 객체(문자열 등)이어야 하지만, 값으로는 정적 객체나 비정적 객체 모두를 사용할 수 있습니다. 이것을 간단하게 다시 말하면 사전의 키로는 단순 객체만 사용할 수 있습니다.

사전을 정의할 때 키와 값의 쌍은 d = {key1 : value1, key2 : value2 }와 같이 지정해 줍니다. 이때 키와 값은 콜론으로 구분하며 각 키-값 쌍은 쉼표로 구분하고 이 모든 것을 중괄호 {}로 묶어야 함을 기억하기 바랍니다.

여기서 사전의 키-값 쌍은 자동으로 정렬되지 않습니다. 이를 위해서는 사용에 앞서 직접 정렬을 해야 합니다.

앞으로 여러분이 사용할 사전은 dict 클래스의 인스턴스/객체입니다.


https://github.com/swaroopch/byte-of-python/blob/master/programs/ds_using_dict.py

# 'ab' is short for 'a'ddress'b'ook

ab = {  'Swaroop'   : 'swaroop@swaroopch.com',
        'Larry'     : 'larry@wall.org',
        'Matsumoto' : 'matz@ruby-lang.org',
        'Spammer'   : 'spammer@hotmail.com'
    }

print "Swaroop's address is", ab['Swaroop']

# Deleting a key-value pair
del ab['Spammer']

print '\nThere are {} contacts in the address-book\n'.format(len(ab))

for name, address in ab.items():
    print 'Contact {} at {}'.format(name, address)

# Adding a key-value pair
ab['Guido'] = 'guido@python.org'

if 'Guido' in ab:
    print "\nGuido's address is", ab['Guido']
ds_using_dict.py(이 코드를 ds_using_dict.py로 저장하세요)

실행 결과는 다음과 같습니다.

$ python ds_using_dict.py
Swaroop's address is swaroop@swaroopch.com

There are 3 contacts in the address-book

Contact Swaroop at swaroop@swaroopch.com
Contact Matsumoto at matz@ruby-lang.org
Contact Larry at larry@wall.org

Guido's address is guido@python.org


먼저 설명한 표기법을 이용하여 사전 ab를 생성합니다. 그러면 앞서 리스트와 튜플을 설명할 때 언급했던 인덱싱 연산자에 키를 지정하여 사전의 키-값 쌍에 접근할 수 있습니다. 간단하지요?

키-값 쌍 또한 del 문으로 삭제할 수 있습니다. del 문에 인덱싱 연산자에 해당 키를 지정해 준 사전을 넘기기만 하면 됩니다. 이때 그 키에 해당하는 값은 알 필요가 없습니다.

다음으로, 사전의 items 메소드를 사용하여 각 키-값 쌍에 접근합니다. 이 메소드는 키와 값 순으로 구성된 튜플을 묶은 튜플 하나를 반환해 줍니다. 그 후 for..in 문을 사용하여 각각을 변수 name과 address에 반복하여 지정하게 하고 그 값을 출력합니다.

이 예제의 'Guido'와 같이 인덱싱 연산자를 사용하여 새 키-값 쌍을 추가할 수도 있습니다. 또, 사전 안에 키-값 쌍이 존재하는지 in 연산자로 확인할 수 있습니다.

dict 클래스의 모든 메소드 목록을 확인하시려면 help(dict)를 입력하면 됩니다.


TIP

키워드 인수와 사전의 관계 함수를 호출할 때 키워드 인수를 사용해 보았다면, 이미 사전을 사용해 보신 것입니다! 여기서 여러분이 지정한 키-값 쌍은 각각 함수를 정의할 때 지정한 매개 변수의 이름과 각 매개 변수에 넘겨줄 값에 대응하는 하나의 사전에 접근하는 것입니다 (이것을 '심볼 테이블'이라고 부릅니다).



12.5 열거형

열거형은 리스트, 튜플, 문자열 같은 것입니다. 그러면 열거형이란 무엇이고 열거형에서는 무엇이 중요할까요?

열거형의 주요한 두 가지 기능은 멤버십 테스트(in 과 not in 연산)와 열거형의 특정 항목을 얻어올 수 있는 '인덱싱 연산'입니다.

또한 리스트, 튜플, 문자열의 세 가지 열거형은 슬라이스 연산 기능을 가지고 있는데, 이것은 열거형의 일부분을 잘라낸(slice) 것을 반환하는 연산, 즉 부분 집합을 반환하는 연산입니다.


https://github.com/swaroopch/byte-of-python/blob/master/programs/ds_seq.py

shoplist = ['apple', 'mango', 'carrot', 'banana']
name = 'swaroop'

# Indexing or 'Subscription' operation #
print 'Item 0 is', shoplist[0]
print 'Item 1 is', shoplist[1]
print 'Item 2 is', shoplist[2]
print 'Item 3 is', shoplist[3]
print 'Item -1 is', shoplist[-1]
print 'Item -2 is', shoplist[-2]
print 'Character 0 is', name[0]

# Slicing on a list #
print 'Item 1 to 3 is', shoplist[1:3]
print 'Item 2 to end is', shoplist[2:]
print 'Item 1 to -1 is', shoplist[1:-1]
print 'Item start to end is', shoplist[:]

# Slicing on a string #
print 'characters 1 to 3 is', name[1:3]
print 'characters 2 to end is', name[2:]
print 'characters 1 to -1 is', name[1:-1]
print 'characters start to end is', name[:]
ds_seq.py(이 코드를 ds_seq.py로 저장하세요)

실행 결과는 다음과 같습니다.

$ python ds_seq.py
Item 0 is apple
Item 1 is mango
Item 2 is carrot
Item 3 is banana
Item -1 is banana
Item -2 is carrot
Character 0 is s
Item 1 to 3 is ['mango', 'carrot']
Item 2 to end is ['carrot', 'banana']
Item 1 to -1 is ['mango', 'carrot']
Item start to end is ['apple', 'mango', 'carrot', 'banana']
characters 1 to 3 is wa
characters 2 to end is aroop
characters 1 to -1 is waroo
characters start to end is swaroop


먼저, 열거형의 각 항목을 얻기 위해 어떻게 인덱스를 사용하는지 보겠습니다. 이를 다른 말로 서브스크립션 연산 이라고도 합니다. 이 예제와 같이 대괄호 안에 특정 숫자를 지정하면, 파이썬은 열거형에서 해당 숫자의 위치에 있는 항목을 얻어옵니다. 이때 파이썬은 숫자를 0부터 센다는 점을 주의하세요.

따라서 shoplist[0]과 shoplist[3]은 각각 열거형 shoplist의 첫 번째와 네 번째 항목을 읽어옵니다.

인덱스에 음수를 지정할 수도 있습니다. 이 경우, 열거형의 마지막부터 위치를 계산합니다. 따라서, shoplist[-1]은 열거형의 마지막 항목을 의미하며 shoplist[-2]는 열거형의 마지막 항목 바로 뒤의 항목을 의미합니다.

슬라이스 연산은 대괄호 안에 콜론으로 구분한 숫자를 입력하는 것입니다. 슬라이스 연산은 앞서 설명한 인덱싱 연산과 많이 비슷합니다. 이 경우 숫자는 반드시 지정하지 않아도 되지만 콜론은 반드시 넣어야 합니다.

슬라이스 연산에서 콜론 앞의 첫 번째 숫자는 슬라이스를 시작할 위치를, 콜론 뒤의 두 번째 숫자는 슬라이스를 멈출 위치를 의미합니다. 만약 첫 번째 숫자를 지정하지 않으면 파이썬은 열거형의 맨 처음부터 슬라이스를 시작합니다. 두 번째 숫자가 지정되지 않았을 경우에는 열거형의 맨 끝에서 슬라이스를 멈춥니다. 이때 슬라이스는 시작 위치부터 슬라이스를 시작하며 끝 위치의 직전까지 수행합니다. 즉, 시작 위치에 해당하는 항목은 슬라이스에 포함되나 마지막 위치에 해당하는 항목은 포함되지 않습니다.

따라서, shoplist[1:3]은 위치 1에 해당하는 항목부터 시작하여 위치 2에 해당하는 항목을 포함하지만, 위치 3에 해당하는 항목은 포함하지 않습니다. 따라서 두 개의 항목의 슬라이스가 반환됩니다. 이와 비슷하게, shoplist[:]는 전체 열거형의 복사본이 반환됩니다.

슬라이스 숫자로도 음의 위치를 지정할 수 있습니다. 음수는 열거형의 마지막부터 위치를 계산하는 것을 의미합니다. 예를 들어, shoplist[:-1]은 마지막 항목을 제외한 모든 항목을 포함하고 있는 슬라이스를 반환합니다.

슬라이스 숫자에 세 번째 인수를 지정해 줄 수 있는데, 이것은 슬라이스 '스텝'에 해당합니다 (기본값은 1 입니다)

>>> shoplist = ['apple', 'mango', 'carrot', 'banana']
>>> shoplist[::1]
['apple', 'mango', 'carrot', 'banana']
>>> shoplist[::2]
['apple', 'carrot']
>>> shoplist[::3]
['apple', 'banana']
>>> shoplist[::-1]
['banana', 'carrot', 'mango', 'apple']


이 코드에서 확인할 수 있듯 스텝이 2일 경우 위치 0, 2, …​ 에 해당되는 항목이 반환되며 스텝이 3이면 0, 3, …에 해당되는 항목이 반환됩니다.

파이썬 인터프리터에서 여러 가능한 슬라이스 숫자 조합을 시험해 보면 그 결과를 바로 확인할 수 있습니다. 이 모든 사항은 모든 열겨형에 적용되므로, 튜플, 리스트, 문자열의 경우 모두 동일한 방법을 사용할 수 있습니다!


12.6 집합

집합은 정렬되지 않은 단순 객체의 묶음입니다. 집합은 포함된 객체의 순서나 중복에 상관없이 객체의 묶음 자체가 필요할 때 주로 사용합니다.

집합끼리는 멤버십 테스트를 통해 한 집합이 다른 집합의 부분 집합인지 확인할 수 있으며, 두 집합의 교집합인지도 알아낼 수 있습니다.

>>> bri = set(['brazil', 'russia', 'india'])
>>> 'india' in bri
True
>>> 'usa' in bri
False
>>> bric = bri.copy()
>>> bric.add('china')
>>> bric.issuperset(bri)
True
>>> bri.remove('russia')
>>> bri & bric # OR bri.intersection(bric)
{'brazil', 'india'}


이 책을 읽는 여러분은 아마도 학교에서 기초 집합론에 대해 이미 배우셨을 것입니다. 따라서 이 예제에 대해서는 딱히 설명할 것이 없습니다.


12.7 참조

객체를 생성하고 변수에 할당할 때, 사실 실제 객체가 변수에 할당되는 것은 아닙니다! 변수에는 객체의 참조가 할당됩니다. 참조란, 그 변수의 이름이 컴퓨터 메모리 어딘가에 저장되어 있는 실제 객체의 위치를 의미합니다. 이를 '객체에 이름을 바인딩한다'고 말합니다.

일반적으로는 이에 대해 크게 신경 쓸 필요가 없습니다만, 참조로 인해 발생하는 몇 가지 현상에 대해 알 필요가 있습니다.


https://github.com/swaroopch/byte-of-python/blob/master/programs/ds_reference.py

print 'Simple Assignment'
shoplist = ['apple', 'mango', 'carrot', 'banana']
# mylist is just another name pointing to the same object!
mylist = shoplist

# I purchased the first item, so I remove it from the list
del shoplist[0]

print 'shoplist is', shoplist
print 'mylist is', mylist
# Notice that both shoplist and mylist both print
# the same list without the 'apple' confirming that
# they point to the same object

print 'Copy by making a full slice'
# Make a copy by doing a full slice
mylist = shoplist[:]
# Remove first item
del mylist[0]

print 'shoplist is', shoplist
print 'mylist is', mylist
# Notice that now the two lists are different
ds_reference.py(이 코드를 ds_reference.py로 저장하세요)

실행 결과는 다음과 같습니다.

$ python ds_reference.py
Simple Assignment
shoplist is ['mango', 'carrot', 'banana']
mylist is ['mango', 'carrot', 'banana']
Copy by making a full slice
shoplist is ['mango', 'carrot', 'banana']
mylist is ['carrot', 'banana']


주석에 거의 모든 설명을 달아 두었습니다.

리스트와 같은 어떤 열거형이나 복잡한 객체(정수형과 같이 단순 객체를 제외하고)의 복사본을 생성하고 싶을 때에는, 슬라이스 연산자를 이용하여 복사본을 생성해야 합니다. 단순히 한 변수를 다른 변수에 할당하면 두 변수는 같은 객체를 '참조'하게 되며 실제 복사본이 생성되지 않습니다. 이점을 주의하기 바랍니다.


NOTE

펄 프로그래머를 위한 주석이미 존재하는 리스트를 다른 변수에 할당하는 구문은 복사본을 만드는 것이 아닙니다. 열거형의 복사본을 만들려면 반드시 슬라이스 연산자를 사용하시기 바랍니다.



12.8 문자열에 대한 좀 더 자세한 설명

문자열에 대해서는 이미 상세히 다뤘었습니다. 그런데 몇 가지 더 알아두면 좋을 것이 있습니다. 문자열도 객체이므로 여러 메소드를 가지고 있으며, 이 메소드를 통해 문자열의 앞 뒤 공백을 제거하는 등의 일을 할 수 있습니다.

파이썬에서 사용되는 모든 문자열은 str 클래스의 객체입니다. 다음 예제에 이 객체가 제공하는 몇 가지 유용한 메소드들의 용례가 있습니다. str 클래스의 모든 메소드 목록을 확인하려면 help(str)을 실행해 보기 바랍니다.


https://github.com/swaroopch/byte-of-python/blob/master/programs/ds_str_methods.py

# This is a string object
name = 'Swaroop'

if name.startswith('Swa'):
    print 'Yes, the string starts with "Swa"'

if 'a' in name:
    print 'Yes, it contains the string "a"'

if name.find('war') != -1:
    print 'Yes, it contains the string "war"'

delimiter = '_*_'
mylist = ['Brazil', 'Russia', 'India', 'China']
print delimiter.join(mylist)
ds_str_methods.py(이 코드를 ds_str_methods.py로 저장하세요)

실행 결과는 다음과 같습니다.

$ python ds_str_methods.py
Yes, the string starts with "Swa"
Yes, it contains the string "a"
Yes, it contains the string "war"
Brazil_*_Russia_*_India_*_China


여기까지 문자열이 제공하는 여러 메소드에 대해 알아보았습니다. startswith 메소드는 문자열이 주어진 문자열로 시작하는지를 반환합니다. in 연산자로는 문자열에 주어진 문자열이 포함되어 있는지 확인할 수 있습니다.

find 메소드는 문자열 내에 포함된 특정 문자열의 위치를 반환합니다. 이때 주어진 문자열을 찾지 못하면 -1을 반환합니다. 또 str 클래스는 join이라는 좋은 메소드를 가지고 있는데, 이것은 주어진 문자열을 해당 문자열을 구분자로 하여 결합한 하나의 큰 문자열을 만들어 반환해 줍니다.


12.9 요약

이 장에서는 파이썬의 여러 내장 자료구조에 대해 살펴봤습니다. 이 자료 구조는 프로그램을 짧고 보기 쉽게 작성하는데 꼭 필요한 구성 요소입니다.

이제 여러분은 파이썬의 여러 기본적인 문법에 익숙해졋을 것입니다. 이 다음부터는 실제 파이썬 프로그램을 설계하고 작성해 봅니다.