다운로드
작성자: admin 작성일시: 2016-09-17 18:54:48 조회수: 8148 다운로드: 516
카테고리: Python 태그목록:

2.9 파이썬에서 리스트 자료형 다루기

자료의 개수

리스트 변수에 자료가 몇 개 들어가 있는지 알기 위해서는 len이라는 명령을 사용한다.

In [1]:
a = [1, 2, 3]
In [2]:
len(a)
Out:
3

수열 생성하기

0부터 n-1까지 1씩 증가하는 n개의 숫자를 가지는 수열 리스트는 range 명령으로 생성한다. 파이썬2에서는 range 명령만 쓰면 되지만 파이썬3에서는 range 명령으로 만들어진 값을 list 명령을 사용하여 명시적으로 리스트로 바꾸어야 한다.

In [3]:
b = list(range(10))
b
Out:
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

만약 0이 아닌 다른 수부터 증가하게 하려면 다음과 같이 range 명령에 두 개의 숫자를 넣는다. range 명령은 두 숫자 x, y 에 대해 x보다 같거나 크고(이상), y보다 작은(미만) 수열을 만든다. 즉 x는 시작값(start), y는 포함되지 않는 끝값(end) 역할을 한다.

In [4]:
c = list(range(1, 10))
c
Out:
[1, 2, 3, 4, 5, 6, 7, 8, 9]

만약 1씩 증가하는 것이 아니라 2 혹은 3씩 증가하는 수열을 만들고 싶다면 range 명령에 세 개의 숫자를 넣는다. 세번째 숫자는 건너 뛰기 숫자(step) 역할을 한다.

In [5]:
d = list(range(1, 10, 3))
d
Out:
[1, 4, 7]

값을 바꾸기

특정한 원소의 값을 다른 값으로 바꾸는 것을 갱신(update)이라고 한다. 리스트에서 특정 원소의 값을 갱신하려면 다음과 같이 인덱싱한 값에 새로운 값을 대입하면 된다.

In [6]:
d[0] = 100
d
Out:
[100, 4, 7]

자료 추가하기

리스트 변수의 마지막에 자료를 더 추가하려면 다음과 같이 append 메서드를 사용한다. 이 때 메서드란 변수 다음에 점(.)을 찍고 쓰는 명령을 말한다.

In [7]:
e = list(range(4))
e
Out:
[0, 1, 2, 3]
In [8]:
e.append(4)
e
Out:
[0, 1, 2, 3, 4]
In [9]:
e.append(10)
e
Out:
[0, 1, 2, 3, 4, 10]

자료 삭제하기

리스트에서 자료를 하나 삭제하려면 다음과 같이 del 명령을 사용한다.

In [10]:
f = list(range(5))
f
Out:
[0, 1, 2, 3, 4]
In [11]:
f[0]
Out:
0
In [12]:
del f[0]
f
Out:
[1, 2, 3, 4]
In [13]:
f[2]
Out:
3
In [14]:
del f[2]
f
Out:
[1, 2, 4]

리스트 병합

두 개의 리스트를 하나의 리스트로 합칠 때는 + 연산자를 사용한다.

In [15]:
g = [1, 2, 3]
h = [4, 5]
g + h
Out:
[1, 2, 3, 4, 5]

슬라이싱

리스트에서 자료를 하나만 가져오는 것이 아니라 특정 범위의 자료를 모두 가져오고 싶다면 슬라이싱(slicing)이라는 방법을 사용한다. 슬라이싱은 콜론(:) 기호를 사용하여 리스트의 자료 범위를 나타내는 연산이다. 예를 들어 20개의 숫자가 있는 리스트에서 앞의 5개만 가져오고 싶으면 다음과 같이 입력한다.

In [16]:
i = list(range(20))
i
Out:
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
In [17]:
i[0:5]
Out:
[0, 1, 2, 3, 4]

이 때 앞의 0이라는 숫자는 생략할 수 있다.

In [18]:
i[:5]
Out:
[0, 1, 2, 3, 4]

만약 11 번째에서 15번째까지의 자료라면 다음과 같다.

In [19]:
i[10:15]
Out:
[10, 11, 12, 13, 14]

역 인덱싱

음수 인덱스를 사용하면 뒤에서부터 원소를 가리키게 된다. 이때 가장 뒤의 원소는 0이 아니라 -1 이라는 인덱스를 사용한다.

In [20]:
i[-1]
Out:
19

음수 인덱스를 사용할 때도 슬라이싱을 할 수 있다. 두 번째 인덱스가 생략되면 끝까지를 의미한다(-1을 쓸 때와 다르다).

In [21]:
i[-5:-2]
Out:
[15, 16, 17]
In [22]:
i[-3:]
Out:
[17, 18, 19]
In [23]:
i[-3:-1]
Out:
[17, 18]

연습 문제 1

  1. 리스트에는 숫자 뿐 아니라 문자 등 어떤 값도 넣을 수 있다. 10명으로 이루어진 반의 학생 이름을 생각하여 리스트 변수로 만들어 본다.
  2. 전학생이 왔다고 가정하여 리스트에 이름을 추가한다.
  3. 한 명이 전학을 갔다고 가정하고 리스트에서 이름을 삭제한다.
  4. 슬라이싱으로 5번 학생(1번 학생은 가장 처음에 있는 학생이다.)부터 9번 학생까지 5명의 이름을 담은 새로운 리스트를 만든다.

정렬

리스트의 원소를 알파벳 순서대로 정렬하고 싶을 때는 sorted 함수를 사용한다. sorted 함수는 상승(ascending) 정렬을 하며 하락 정렬을 하고 싶을 때는 reverse=True 인수를 사용한다.

In [24]:
j = [3, 1, 4, 2]
sorted(j)
Out:
[1, 2, 3, 4]
In [25]:
k = ["b", "a", "d", "c"]
sorted(k, reverse=True)
Out:
['d', 'c', 'b', 'a']

튜플

리스트와 비슷한 자료형으로 튜플(tuple) 자료형이 있다. 튜플 자료형은 리스트 자료형과 달리 비가변적(immutable) 자료형으로 원소를 변경하지 못한다. 튜플 자료형은 [] 기호 대신 () 기호를 사용하여 나타낸다.

In [26]:
l = [1, 2, 3]
m = (1, 2, 3)
In [27]:
l[0] = 10
l
Out:
[10, 2, 3]
In [28]:
m[0] = 10  # 에러가 발생한다.
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
 in 
----> 1 m[0] = 10  # 에러가 발생한다.

TypeError: 'tuple' object does not support item assignment

튜플을 원소로 가지는 리스트의 정렬

튜플을 원소로 가지는 리스트의 경우에는 첫번째 튜플 원소를 기준으로 정렬한다.

In [29]:
n = [(90, "영희"), (80, "철수"), (100, "춘향"), (70, "몽룡")]
sorted(n)
Out:
[(70, '몽룡'), (80, '철수'), (90, '영희'), (100, '춘향')]

zip 함수

zip 함수는 두 개의 리스트(혹은 튜플)을 입력으로 받아서 순서가 같은 각 원소 쌍 튜플을 원소로 가지는 새로운 리스트를 만든다.

In [30]:
o = [1, 2, 3]
p = [10, 20, 30]
list(zip(o, p))
Out:
[(1, 10), (2, 20), (3, 30)]

zip 함수의 인수 앞에 * 연산자를 붙이면 zip 함수의 반대 연산을 한다. 즉, 원소 쌍 튜플의 각 원소를 두 개의 튜플로 나누어 준다.

In [31]:
q = [(1, 10), (2, 20), (3, 30)]
list(zip(*q))
Out:
[(1, 2, 3), (10, 20, 30)]

연습 문제 2

다음과 같은 두 개의 리스트가 있다. 각각의 리스트는 학생의 점수와 이름을 나타낸다.

x = [90, 80, 100, 70]
y = ["영희", "철수", "춘향", "몽룡"]

학생 이름을 점수 기준으로 상승 정렬하라.

질문/덧글

아직 질문이나 덧글이 없습니다. 첫번째 글을 남겨주세요!