시퀀스 자료형

다음의 자료형들을 시퀀스 자료형이라 한다.

  • 문자열(string)
  • 리스트(list)
  • 튜플(순서쌍, tuple)
  • 어레이(array)

이외에 사전(딕셔너리, dictionary), 링크드 리스트(linked list), 스택(stack), 큐(queue) 등도 시퀀스 자료형이며 연습문제 등을 통해 다룰 예정이다.

문자열


In [1]:
a = 'hello world'

자료형을 알고 싶을 경우 type 함수 활용


In [2]:
type(a)


Out[2]:
str

len 함수는 문자열 자료형에만 사용되는 함수(메소드)가 아니며 모든 시퀀스 자료형에 사용할 수 있는 함수이다.


In [3]:
len(a)


Out[3]:
11

문자열을 표현하는 데에는 세 가지 방식이 있다.

  • 'A string'
  • "Another string"
  • """A string with triple quotes can extend
    over several
    lines"""

인용하는 문장속에 작은따옴표(') 또는 큰따옴표(")가 사용되는 경우 아래와 같이 사용해야 한다.

  • "A string with a ' in the middle"
  • 'A string with a " in the middle'
  • """A string with a ' and a " in the middle"""

문자열 연산

a = "One"; b = "Two" ; c = "Three" 라 할 때 아래 명령어를 실행한 결과를 예상해 볼 것.

문자열들의 덧셈은 이어붙이기 기능이다.

  • d = a + b + c

문자열과 정수의 곱은 곱한 숫자만큼 복사하여 이어붙이는 기능이다. 음의 정수인 경우 0을 곱해주는 것과 동일하게 처리한다. 문자열들 끼리의 곱 또는 뺄셈, 나눗셈은 정의되어 있지 않다.

  • 3 * dd + d + d와 같다.
  • 0 * d 또는 -2 * d 빈 문자열('')와 같다.

In [4]:
a = 'One' ; b = 'Two' ; c = 'Three'

In [5]:
d = a + b + c
print(d)


OneTwoThree

In [6]:
3 * d


Out[6]:
'OneTwoThreeOneTwoThreeOneTwoThree'

In [7]:
d * -1


Out[7]:
''

인덱싱

문자열 등 시퀀스 자료형의 값에 들어있는 값들은 인덱스를 활용하여 끄집어낼 수 있다.

  • s[i] 형태로 사용된다.
  • 인덱스 i0, 1, 2, ... 이다. 0부터 시작함에 주의하라.
  • i 가 움직일 수 있는 범위는 기본적으로 0부터 len(s) - 1이다.
  • ilen(s) - 1보다 클 경우 에러 발생.

In [8]:
d[0]


Out[8]:
'O'

In [9]:
d[2]


Out[9]:
'e'

In [10]:
len(d)


Out[10]:
11

인덱스 i의 값은 음수도 될 수도 있다.

  • - len(s) <= i <= -1
  • -1, -2, ..., -len(s) 등 거꾸로 인덱싱한다.

In [11]:
d[-1]


Out[11]:
'e'

In [12]:
d[-11]


Out[12]:
'O'

슬라이싱

문자열 등 시퀀스 자료형 값의 일부 구간을 슬라이싱을 활용하여 추출할 수 있다.

  • s[i:j:k] 형태로 사용되며 좀 더 간단한 형태로 사용 가능하다.
  • i는 추출하고자 하는 구간의 처음 시작 인덱스임.
  • j는 추출하고자 하는 구간의 마지막 인덱스보다 1 큰 숫자임.
  • k는 뽑고자 하는 스텝의 크기를 결정한다.
  • 즉, i 인덱스 값에서부터 j-1 인덱스 값을 차례대로 추출하지만 k개에 한 개꼴로 추출한다.

In [13]:
d[1:] # 두 번째 원소부터 끝까지. 스텝 k가 생략되었을 경우 k=1로 간주함.


Out[13]:
'neTwoThree'

In [14]:
d[:5] # 처음부터 4번 인덱스까지.


Out[14]:
'OneTw'

In [15]:
d[::3] # 전체 구간에서 3개중에 하나꼴로 추출


Out[15]:
'OTTe'

In [16]:
d[::-1] # 스텝이 음수일 경우 역순으로 추출. 즉, 시작과 끝이 뒤바뀐다.


Out[16]:
'eerhTowTenO'

In [17]:
d[3:10:-2]


Out[17]:
''

In [18]:
d[10:3:-2]


Out[18]:
'erTw'

문자열 관련 메소드

문자열 관련 메소드는 문자열과 연동해서만 사용 가능하다. 많은 종류의 메소드가 존재하며 dir(s) 형태로 어떤 메소드가 있는지 확인할 수 있다. (s는 임의의 문자열이어야 한다)

문자열 메소드 예제:

  • count
  • replace
  • upper
  • swapcase 등등

주의: len 함수는 문자열 관련 메소드가 아님.


In [19]:
s = """My first look at Python was an
    accident, and I didn't much like what 
    I saw at the time."""

count 메소드

문자열에서 특정 부분문자열(substring)이 몇 번 사용되는가를 확인해주는 메소드


In [20]:
s.count('e ') # count(s, e) 형태가 아님에 주의할 것


Out[20]:
2

In [21]:
s.count('at')


Out[21]:
3

replace 메소드

특정 부분문자열 특정 부분문자열로 대체하는 함수.


In [22]:
s.replace('at', 'kkk')


Out[22]:
"My first look kkk Python was an\n    accident, and I didn't much like whkkk \n    I saw kkk the time."

upper 메소드

소문자를 모두 대문자로 바꾸는 함수


In [23]:
s.upper()


Out[23]:
"MY FIRST LOOK AT PYTHON WAS AN\n    ACCIDENT, AND I DIDN'T MUCH LIKE WHAT \n    I SAW AT THE TIME."

swapcase 메소드

대문자는 소문자로, 소문자는 대문자로 변경하는 함수


In [24]:
a = s.swapcase()
print(a)


mY FIRST LOOK AT pYTHON WAS AN
    ACCIDENT, AND i DIDN'T MUCH LIKE WHAT 
    i SAW AT THE TIME.

주의: 문자열 s 자체가 변하지는 않는다. 전문용어로 문자열은 immutable 자료형이라고 부른다.


In [25]:
s


Out[25]:
"My first look at Python was an\n    accident, and I didn't much like what \n    I saw at the time."

문자열 관련 메소드의 목록을 확인하고자 할 땐 dir 함수 활용 가능


In [26]:
dir(s)


Out[26]:
['__add__',
 '__class__',
 '__contains__',
 '__delattr__',
 '__doc__',
 '__eq__',
 '__format__',
 '__ge__',
 '__getattribute__',
 '__getitem__',
 '__getnewargs__',
 '__getslice__',
 '__gt__',
 '__hash__',
 '__init__',
 '__le__',
 '__len__',
 '__lt__',
 '__mod__',
 '__mul__',
 '__ne__',
 '__new__',
 '__reduce__',
 '__reduce_ex__',
 '__repr__',
 '__rmod__',
 '__rmul__',
 '__setattr__',
 '__sizeof__',
 '__str__',
 '__subclasshook__',
 '_formatter_field_name_split',
 '_formatter_parser',
 'capitalize',
 'center',
 'count',
 'decode',
 'encode',
 'endswith',
 'expandtabs',
 'find',
 'format',
 'index',
 'isalnum',
 'isalpha',
 'isdigit',
 'islower',
 'isspace',
 'istitle',
 'isupper',
 'join',
 'ljust',
 'lower',
 'lstrip',
 'partition',
 'replace',
 'rfind',
 'rindex',
 'rjust',
 'rpartition',
 'rsplit',
 'rstrip',
 'split',
 'splitlines',
 'startswith',
 'strip',
 'swapcase',
 'title',
 'translate',
 'upper',
 'zfill']

특정 메소드의 기능을 확인하고자 할 땐 help 함수 활용 가능. 단, 메소드이기 때문에 특정 객체와 함께 사용해야 한다. 예를 들어 count 메소드의 경우 help(count) 명령어는 오류를 유발한다.


In [27]:
help(s.count)


Help on built-in function count:

count(...)
    S.count(sub[, start[, end]]) -> int
    
    Return the number of non-overlapping occurrences of substring sub in
    string S[start:end].  Optional arguments start and end are interpreted
    as in slice notation.


In [28]:
s.swapcase()


Out[28]:
"mY FIRST LOOK AT pYTHON WAS AN\n    ACCIDENT, AND i DIDN'T MUCH LIKE WHAT \n    i SAW AT THE TIME."

리스트(List)

  • 파이썬에서 다룰 수 있는 모든 종류의 값들을 한데 묶어서 활용할 수 있다.
  • 주의: C, C#, Java 등에서와는 달리 임의의 자료형들의 값들을 하나로 묶을 수 있다.
  • C, C#, Java 등에서도 자료형이 다른 값들로 이루어진 list를 다룰 수 있다. 하지만 포인터를 이용해야 한다. 관심 있는 학생은 한 번 시도해보기를 바란다.

비어 있는 배열(empty list)


In [29]:
[]


Out[29]:
[]

자료형은 list


In [30]:
type([])


Out[30]:
list

여러 개의 자료형을 담을 수 있다!


In [31]:
[43, 'hello', [1, 2]]


Out[31]:
[43, 'hello', [1, 2]]

리스트를 원하는 만큼 중첩해서 사용할 수 있다.


In [32]:
[[1, 2], [3, 4], [[5, 6, 7]]]


Out[32]:
[[1, 2], [3, 4], [[5, 6, 7]]]
  • 리스트 관련 메소드의 종류는 문자열 관련 메소드의 종류보다 적다.
  • 동일한 이름의 메소드 또한 존재한다. count, index 등등.

In [33]:
dir([])


Out[33]:
['__add__',
 '__class__',
 '__contains__',
 '__delattr__',
 '__delitem__',
 '__delslice__',
 '__doc__',
 '__eq__',
 '__format__',
 '__ge__',
 '__getattribute__',
 '__getitem__',
 '__getslice__',
 '__gt__',
 '__hash__',
 '__iadd__',
 '__imul__',
 '__init__',
 '__iter__',
 '__le__',
 '__len__',
 '__lt__',
 '__mul__',
 '__ne__',
 '__new__',
 '__reduce__',
 '__reduce_ex__',
 '__repr__',
 '__reversed__',
 '__rmul__',
 '__setattr__',
 '__setitem__',
 '__setslice__',
 '__sizeof__',
 '__str__',
 '__subclasshook__',
 'append',
 'count',
 'extend',
 'index',
 'insert',
 'pop',
 'remove',
 'reverse',
 'sort']

append 메소드

매우 자주 사용되는 리스트 관련 메소드이며 기존의 리스트에 새로운 값을 하나 추가하는 기능을 갖고 있다.


In [34]:
help([].append)


Help on built-in function append:

append(...)
    L.append(object) -- append object to end


In [35]:
l = []

In [36]:
l.append(10)
l


Out[36]:
[10]

In [37]:
l.append(20)
l


Out[37]:
[10, 20]

In [38]:
l.append(30)
l


Out[38]:
[10, 20, 30]

인덱싱과 슬라이싱

  • 문자열에서 사용하는 방식과 동일함.

In [39]:
l[::-2]


Out[39]:
[30, 10]
  • 다중 리스트의 경우 인덱싱과 슬라이싱을 중첩해서 사용할 수 있다.

In [40]:
ll = [[1, 2], [3,4]]

In [41]:
ll[0][::-1]


Out[41]:
[2, 1]

len, max, min, in 함수

  • 특정 자료형에 속하는 메소드가 아니다.
  • 모든 시퀀스 자료형을 인자로 받아 동일한 기능을 수행한다.
  • len: 해당 시퀀스 값의 길이 리턴
  • max/min: 해당 시퀀스 값에 포함된 값들 중에서 최대값/최소값 리턴
  • in: 특정 값이 해당 시퀀스 값에 나타나는지 여부를 리턴(True/False)

In [42]:
len(ll[0])


Out[42]:
2

In [43]:
help(max)


Help on built-in function max in module __builtin__:

max(...)
    max(iterable[, key=func]) -> value
    max(a, b, c, ...[, key=func]) -> value
    
    With a single iterable argument, return its largest item.
    With two or more arguments, return the largest argument.

파이썬의 모든 자료형 들 사이에는 순서가 있다.

숫자 < 리스트 < 문자열


In [44]:
2 < []


Out[44]:
True

In [45]:
[2, 1] < ''


Out[45]:
True

In [46]:
'' < 1


Out[46]:
False

In [47]:
5 < [1,2]


Out[47]:
True

In [48]:
[4, 5] < [[3]]


Out[48]:
True

In [49]:
[1, 2] < (1, 2)


Out[49]:
True

In [50]:
max([500, 700, [1,1], [[1]], ''])


Out[50]:
''

In [51]:
min([500, 700, [1,1], [[1]], ''])


Out[51]:
500

in 함수 예제


In [52]:
'e' in 'hello world'


Out[52]:
True

In [53]:
4 in [3, 4]


Out[53]:
True

튜플(Tuple)

튜플은 순서쌍이라고도 불린다.

  • 리스트와 99% 비슷한 용도를 가짐
  • 소괄호('(1, 2, 3)' 등등)를 이용하여 여러개의 값을 들고 다님.

In [54]:
t = (3, 4, 50)
t


Out[54]:
(3, 4, 50)

In [55]:
type(t)


Out[55]:
tuple

In [56]:
l = [3, 4, 50]
l


Out[56]:
[3, 4, 50]

In [57]:
type(l)


Out[57]:
list

튜플의 경우 인덱싱과 슬라이싱은 문자열 또는 리스트에서의 활용과 100% 동일


In [58]:
t[1]


Out[58]:
4

In [59]:
t[-1]


Out[59]:
50

튜플을 사용할 때 소괄호를 생략해도 된다. 하지만 기본적으로 소괄을 사용한다.


In [60]:
a = 10, 20, 30
type(a)


Out[60]:
tuple

In [61]:
print(a)


(10, 20, 30)

주의

리스트와는 달리 인덱싱을 사용하여 튜플 특정 원소의 값을 변경할 수 없다. 문자열 자료형처럼 튜플 자료형도 immutable이기 때문이다.


In [62]:
t[1] = 5


---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-62-e9323da3946c> in <module>()
----> 1 t[1] = 5

TypeError: 'tuple' object does not support item assignment
튜플 자료형의 중요성
  • 절대로 변경되지 않거나 변경되어서는 안되는 값들을 저장할 때 사용
  • 여러 개의 변수들에 여러 개의 값들을 한 줄에 동시에 할당하기 위해 사용

    x, y, z = 0, 0, 1

  • 여러 개의 값들을 리턴하는 함수를 정의할 때 사용


In [63]:
a, b = 1, 2

In [64]:
a


Out[64]:
1

두 변수에 할당된 값을 스왑(swap)하는 것이 매우 간단하다.


In [65]:
a, b = b, a

In [66]:
a


Out[66]:
2

주의: C, C#, Java 등에서 앞서의 예제와 같은 스왑기능을 구현하려면 포인터를 사용해야 한다. 관심있는 학생은 시도해보기를 추천한다.


In [67]:
def f(x):
    return x**2, x**3

In [68]:
a, b = f(2)

In [69]:
a


Out[69]:
4

참조: 튜플의 불변성(immutability) 성질은 이후에 배우게 될 사전(dictionary) 자료형을 다룰 때 유용하게 활용된다.

불변성(immutability)대 가변성(mutability)

  • 문자열과 튜플은 불변성 자료형이다.

In [70]:
a = 'hello world'
a[4] = 'x'


---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-70-982f80a376e9> in <module>()
      1 a = 'hello world'
----> 2 a[4] = 'x'

TypeError: 'str' object does not support item assignment

이미 특정 변수에 할당된 문자열을 수정하고자 할 때는 재할당을 사용해야 한다.

예를 들어, 아파트가 문자열 또는 튜플 자료형이라면 아파트를 수선할 수는 없고, 대신에 기존 아파트를 부신 다음에 새로 원하는 대로 지어야 함을 의미한다.


In [71]:
a = a[0:3] + 'x' + a[4:]
a


Out[71]:
'helxo world'

시퀀스 자료형 정리

  • 지금까지 문자열, 리스트, 튜플 등 세 종류의 시퀀스 자료형을 살펴 보았다.
  • 아래의 연산다들이 지금까지 다룬 모든 시퀀스 자료형과 관련하여 사용할 수 있다. (i, j, n은 정수를 의미하고, a, b는 시퀀스 자료형을 의미한다.)

    • a[i]: ai 번째 인덱스 값 리턴
    • a[i:j]: ai 번째 인덱스 값부터 j-1번째 인덱스 값까지 리턴
    • len(a): a에 포함된 원소들의 개수
    • max(a)/min(a): a의 원소들 중에서 최대값/최소값 리턴
    • x in a: xa의 원소일 때 True 리턴, 아니면 False 리턴
    • a + b: ab를 이어붙인 값을 리턴
    • n * a: an번 이어붙인 값을 리턴