3.1 자료구조와 순차 자료형

  • 가장 자주 사용되는 순차 자료형인 튜플, 리스트, 딕셔너리 살펴보기

3.1.1 튜플

  • 튜플은 한 번 할당되면 변경 불가, 고정 길이를 갖는다.
  • 쉼표로 구분되는 일련의 값을 괄호로 감싸는 것
>>> tup = (4, 5, 6)
tup
(4, 5, 6)
  • 괄호 생략 가능
>>> tup = 4, 5, 6
tup
(4, 5, 6)
  • tuple 메서드를 통해 튜플로 변환
>>> tuple([4,0,2])
(4, 0, 2)
>>> tup = tuple('string')
>>> tup
('s', 't', 'r', 'i', 'n', 'g')
  • 자료형의 색인은 0부터
>>> tup[0]
's'
  • 복잡한 식
>>> nested_tup = (4, 5, 6), (7, 8)
>>> nested_tup
((4, 5, 6), (7, 8))
>>> nested_tup[0]
(4, 5, 6)
>>> nested_tup[1]
(7, 8)
  • 예제1)
>>> tup = tuple(['foo',[1,2], True])
>>> tup[2] = False
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'tuple' object does not support item assignment
  • 튜플 내에 저장된 객체는 그 위치에서 바로 변경 가능
>>> tup[1]
[1, 2]
>>> tup[1].append(3)
>>> tup[1]
[1, 2, 3]
>>> tup
('foo', [1, 2, 3], True)

1. 튜플에서 값 분리하기

>>> tup = (4, 5, 6)
>>> a, b, c = tup
>>> a
4
>>> b
5
>>> c
6
>>> tup = 4, 5, (6, 7)
>>> a, b, (c, d) = tup
>>> a
4
>>> b
5
>>> c
6
>>> d
7
  • 동일한 형태로 대입해야 함.
>>> tup = 4, 5, (6, 7)
>>> a, b, c, d = tup
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: not enough values to unpack (expected 4, got 3)
  • 튜플이나 리스트 순회
>>> seq = [(1,2,3),(4,5,6),(7,8,9)]
>>> for a,b,c in seq:
...     print(f'a={a}, b={b}, c={c}')
...
a=1, b=2, c=3
a=4, b=5, c=6
a=7, b=8, c=9
  • *rest : 길이를 알 수 없는 긴 인수를 담음
>>> values = 1,2,3,4,5
>>> a, b, *rest = values
>>> a
1
>>> b
2
>>> rest
[3, 4, 5]

2. 튜플 메서드

  • count : 주어진 값과 같은 값의 개수를 반환
>>> a = (1, 2, 2, 2, 3, 4, 2)
>>> a.count(2)
4
>>> a.count(1)
1
>>> a.count(3)
1
>>> a.count(5)
0

3.1.2 리스트

  • 대괄호([])나 list 함수 사용해서 생성
>>> a_list = [2, 3, 7, None]
>>> tup = ('foo', 'bar', 'baz')
>>> b_list = list(tup)
>>> b_list
['foo', 'bar', 'baz']
>>> b_list[1]
'bar'
>>> b_list[1] = 'peekaboo'
>>> b_list
['foo', 'peekaboo', 'baz']
>>> gen = range(10)
>>> gen
range(0, 10)
>>> list(gen)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

1. 원소 추가하고 삭제하기

>>> b_list
['foo', 'peekaboo', 'baz']
>>> b_list.append('dwarf')
>>> b_list
['foo', 'peekaboo', 'baz', 'dwarf']
>>> b_list.insert(1, 'red')
>>> b_list
['foo', 'red', 'peekaboo', 'baz', 'dwarf']
  • insert는 추가된 값 이후의 값을 모두 이동시켜야 하므로 append에 비해 연산 비용이 많이 든다. 양방향 큐인 collections.deque를 사용하자.
>>> b_list.pop(2)
'peekaboo'
>>> b_list
['foo', 'red', 'baz', 'dwarf']
  • in 예약어를 사용해서 리스트에 해당 값이 있는지 검사함.
>>> 'dwarf' in b_list
True
>>> 'dwarf' not in b_list
False

2. 리스트 이어 붙이기

>>> [4, None, 'foo'] + [7, 8, (2, 3)]
[4, None, 'foo', 7, 8, (2, 3)]
  • 리스트를 미리 정의했다면 extend 메서드를 통해 여러 개의 값을 추가할 수 있다.
>>> x = [4, None, 'foo']
>>> x.extend([7, 8, (2, 3)])
>>> x
[4, None, 'foo', 7, 8, (2, 3)]

3. 정렬

  • sort 함수를 이용해서 새로운 리스트를 생성하지 않고 있는 그대로 리스트를 정렬할 수 있다.
>>> a = [7, 2, 5, 1, 3]
>>> a.sort()
>>> a
[1, 2, 3, 5, 7]
  • key=len : 문자열 길이가 짧은 순서대로 정렬
>>> b = ['saw', 'small', 'He', 'foxes', 'six']
>>> b.sort(key=len)
>>> b
['He', 'saw', 'six', 'small', 'foxes']

4. 슬라이싱

>>> seq = [7, 2, 3, 7, 5, 6, 0, 1]
>>> seq[1:5]
[2, 3, 7, 5]
>>> seq[3:5] = [6, 3]
>>> seq
[7, 2, 3, 6, 3, 6, 0, 1]
>>> seq[:5]
[7, 2, 3, 6, 3]
>>> seq[3:]
[6, 3, 6, 0, 1]
>>> seq[-4:]
[3, 6, 0, 1]
>>> seq[-6:-2]
[3, 6, 3, 6]
>>> seq[::2]	# 간격 지정
[7, 3, 3, 0]
>>> seq[::-1]	# 역순으로 반환
[1, 0, 6, 3, 6, 3, 2, 7]
profile
내년엔 나도 데이터 엔지니어 !!!

0개의 댓글