9. 리스트의 기초




1 리스트 생성 및 기본 연산


  • 리스트: 시퀀스 자료형이면서 변경 가능(Mutable)
  • 리스트에서 지원하는 일반적인 연산
    • 인덱싱, 슬라이싱, 연결, 반복, 멤버쉽 테스트
In [2]:
l = []
l = [1, 2, "Great"]
print(l[0], l[-1])
print(l[1:3], l[:])
print()

L = range(10)
print(L[::2])
print(list(L)[::2])
print()

print(l * 2)
print(l + [3, 4, 5])
print(len(l))
print()
print(4 in L)
1 Great
[2, 'Great'] [1, 2, 'Great']

range(0, 10, 2)
[0, 2, 4, 6, 8]

[1, 2, 'Great', 1, 2, 'Great']
[1, 2, 'Great', 3, 4, 5]
3

True
  • Mutable 특성을 지닌 리스트의 값 변경
In [3]:
a = ['spam', 'eggs', 100, 1234]
a[2] = a[2] + 23
print(a)
['spam', 'eggs', 123, 1234]
  • 리스트 원소에 대한 슬라이스 치환
In [5]:
a = ['spam', 'eggs', 123, 1234]
a[0:2] = [1, 12] # 동일한 크기에 대한 슬라이스 치환
print(a)

a[0:2] = [1] # 서로 다른 크기에 대한 슬라이스 치환
print(a)

a[0:1] = [1, 2, 3] # 서로 다른 크기에 대한 슬라이스 치환
print(a)
[1, 12, 123, 1234]
[1, 123, 1234]
[1, 2, 3, 123, 1234]
  • 리스트 원소에 대한 슬라이스 삭제
In [6]:
a = [1, 12, 123, 1234]
a[0:2] = []

print(a)
[123, 1234]
  • 리스트 원소 사이에 슬라이스 삽입
In [7]:
a = [123, 1234]
a[1:1] = ['spam', 'ham'] # 1번째 인덱스에 삽입
print(a)

b = [123, 1234]          
b[1:2] = ['spam', 'ham'] # 1번째 원소에 대한 치환
print(b)

a[:0] = a # 리스트 맨 앞에 자기 자신을 삽입
print(a)
[123, 'spam', 'ham', 1234]
[123, 'spam', 'ham']
[123, 'spam', 'ham', 1234, 123, 'spam', 'ham', 1234]
  • del을 이용한 리스트 요소 삭제
In [8]:
a = [1, 2, 3, 4]
del a[0]
print(a)

del a[1:]
print(a)
[2, 3, 4]
[2]
In [9]:
# a = range(4)
a = list(range(4))
print(a)
print(a[::2])

del a[::2]
print(a)
[0, 1, 2, 3]
[0, 2]
[1, 3]
  • 리스트 자체에 대한 삭제
    • 정확히는 리스트를 가리키는 레퍼런스를 지닌 변수 a 삭제
In [10]:
a = range(5)
del a
print(a)
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
<ipython-input-10-a1e3c3afe17a> in <module>()
      1 a = range(5)
      2 del a
----> 3 print(a)

NameError: name 'a' is not defined
  • 중첩 리스트: 리스트 안에 요소로서 리스트를 지닌 리스트
In [11]:
s = [1, 2, 3]
t = ['begin', s, 'end']
print(t)

print(t[1][1])
['begin', [1, 2, 3], 'end']
2
In [12]:
s[1] = 100
print(t)
['begin', [1, 100, 3], 'end']
In [13]:
L = [1, ['a', ['x', 'y'], 'b'], 3]
print(L[0])
print(L[1])
print(L[1][1])
print(L[1][1][1])
1
['a', ['x', 'y'], 'b']
['x', 'y']
y
  • range: 순차적인 정수 리스트 생성 가능한 시퀀스형 range 객체 만들기
In [15]:
print(range(10)) # 0(Included)부터 10(Excluded)까지

print(range(5, 15)) # 5(Included)부터 15(Excluded)까지

print(range(5, 15, 2)) # 0(Included)부터 10(Excluded)까지, Step: 2
range(0, 10)
range(5, 15)
range(5, 15, 2)
In [16]:
print(list(range(10))) # 0(Included)부터 10(Excluded)까지

print(list(range(5, 15))) # 5(Included)부터 15(Excluded)까지

print(list(range(5, 15, 2))) # 0(Included)부터 10(Excluded)까지, Step: 2
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
[5, 7, 9, 11, 13]
In [19]:
for el in range(10):
    print(el, 'inch =', el * 2.54, 'centi')
0 inch = 0.0 centi
1 inch = 2.54 centi
2 inch = 5.08 centi
3 inch = 7.62 centi
4 inch = 10.16 centi
5 inch = 12.7 centi
6 inch = 15.24 centi
7 inch = 17.78 centi
8 inch = 20.32 centi
9 inch = 22.86 centi
  • 아래 코드가 더 좋음
In [25]:
for el in range(10):
    print("%d inch = %.2f centi" % (el, el * 2.54))
0 inch = 0.00 centi
1 inch = 2.54 centi
2 inch = 5.08 centi
3 inch = 7.62 centi
4 inch = 10.16 centi
5 inch = 12.70 centi
6 inch = 15.24 centi
7 inch = 17.78 centi
8 inch = 20.32 centi
9 inch = 22.86 centi
In [27]:
for el in range(10):
    print("{0} inch = {1:.2f} centi".format(el, el * 2.54))
0 inch = 0.00 centi
1 inch = 2.54 centi
2 inch = 5.08 centi
3 inch = 7.62 centi
4 inch = 10.16 centi
5 inch = 12.70 centi
6 inch = 15.24 centi
7 inch = 17.78 centi
8 inch = 20.32 centi
9 inch = 22.86 centi
In [28]:
sun, mon, tue, wed, thu, fri, sat = range(7)
print(sun, mon, tue, wed, thu, fri, sat)
0 1 2 3 4 5 6
  • 리스트 안의 각 자료가 튜플일 때 for 문을 사용하여 값 추출 방법
In [29]:
lt = [('one', 1), ('two', 2), ('three', 3)]
for t in lt:
    print('name =', t[0] ,', num =', t[1])
name = one , num = 1
name = two , num = 2
name = three , num = 3
  • 아래 코드가 더 좋음
In [30]:
lt = [('one', 1), ('two', 2), ('three', 3)]
for t in lt:
    print('name = %s, num = %s' % t)
name = one, num = 1
name = two, num = 2
name = three, num = 3
In [33]:
lt = [('one', 1), ('two', 2), ('three', 3)]
for t in lt:
    print('name = {0}, num = {1}'.format(t[0], t[1]))
name = one, num = 1
name = two, num = 2
name = three, num = 3
  • for 문의 헤더에서 각 튜플의 값 추출
In [20]:
lt = [('one', 1), ('two', 2), ('three', 3)]
for name, num in lt:
    print(name, num)
one 1
two 2
three 3
  • 리스트 안의 각 자료가 리스트여도 for 문의 헤더에서 동일하게 값 추출 가능
In [21]:
LL = [['one', 1], ['two', 2], ['three', 3]]
for name, num in LL:
    print(name, num)
one 1
two 2
three 3

2 리스트 메소드


2-1 리스트가 지원하는 메소드

In [22]:
s = [1, 2, 3]

s.append(5) # 리스트 맨 마지막에 정수 값 5 추가
print(s)

s.insert(3, 4) # 3 인덱스 위치에 정수 값 4 추가
print(s)
[1, 2, 3, 5]
[1, 2, 3, 4, 5]
In [23]:
s = [1, 2, 3, 4, 5]

print(s.index(3))        # 값 3의 인덱스 반환

print(s.count(2))        # 값 2의 개수 반환

s = [1, 2, 2, 2, 2, 2, 3, 4, 5]
print(s.count(2))
2
1
5
In [34]:
s = [1, 2, -10, -7, 100]
k = s.reverse() # 자료의 순서를 뒤집기 (반환값 없음 --> 리스트 자체의 내부 원소 배열이 변경됨)   
print(k)
print(s)

k = s.sort() # 정렬 (반환값 없음 --> 리스트 자체의 내부 원소 배열이 변경됨)
print(k)
print(s)
None
[100, -7, -10, 2, 1]
None
[-10, -7, 1, 2, 100]
In [35]:
s = [10, 20, 30, 40, 50]
s.remove(10) # 자료 값 10 삭제
print(s)

s = [10, 20, 30, 20, 40, 50] # 자료 값이 여러개 존재하면 첫번째 것만 삭제
s.remove(20)
print(s)

s.extend([60, 70]) # 새로운 리스트([60, 70]를 기존 리스트 s 뒤에 병합
print(s)

s.append([60, 70]) # 주의: append로 새로운 리스트를 추가하면 하나의 자료 요소로서 추가
print(s)
[20, 30, 40, 50]
[10, 30, 20, 40, 50]
[10, 30, 20, 40, 50, 60, 70]
[10, 30, 20, 40, 50, 60, 70, [60, 70]]

2-2 리스트를 스택(Stack)으로 사용하기

  • LIFO (Last Input First Output)
In [36]:
s = [10, 20, 30, 40, 50]
s.append(60)
print(s)

# If no index is specified, a.pop() removes and returns the last item in the list. 
print(s.pop())  

print(s)
[10, 20, 30, 40, 50, 60]
60
[10, 20, 30, 40, 50]

image

In [37]:
s = [10, 20, 30, 40, 50]
print(s.pop(0))   #0 번째 인덱스 값을 꺼낸다.

print(s)

print(s.pop(1))   #1 번째 인덱스 값을 꺼낸다.

print(s)
10
[20, 30, 40, 50]
30
[20, 40, 50]

2-3 리스트를 큐(Queue)로 사용하기

  • FIFO (First Input First Output)
In [38]:
q = [10, 20, 30, 40, 50]
q.append(60)
print(q.pop(0))

print(q)
10
[20, 30, 40, 50, 60]

image

참고 문헌: 파이썬(열혈강의)(개정판 VER.2), 이강성, FreeLec, 2005년 8월 29일