대부분의 프로그래밍 과정은 데이터를 잘게 나누고, 이들을 붙여서 특정한 형태로 만듭니다. 그렇기 때문에 데이터를 어떤 형태로 담아서 처리할지, 즉 어떤 자료구조를 사용해 데이터를 처리할지는 중요한 문제입니다. 그렇기에 대부분의 프로그래밍 언어는 많이 사용되는 자료구조를 기본적으로 지원해 줍니다. 예를 들어, C++는 STL을 통해 컨테이너 형태로 vector, deque, list, map, set 자료구조를 지원합니다. C++에서는 STL을 배워야 사용할 수 있던걸 파이썬에서는 허무할 정도로 쉽게 사용이 가능합니다.

 

혹시 Java에서 모든 변수는 포인터 변수 혹은 참조자라는걸 알고 계신가요? Java에서 모든 것은 객체로 표현되고 변수는 해당 객체를 참조합니다. 파이썬도 마찬가지입니다. 지금부터 살펴볼 4가지 자료구조는 객체로 표현됩니다. 당연히 해당 자료구조를 사용할때 필요한 기능들을 멤버 함수로 제공하고 있습니다. 

 

 

 

list 자료구조


list 자료구조는 데이터를 순차적으로 담는 구조입니다. 순서가 있기 때문에 [] 연산자를 사용할 수 있습니다. 모양은 아래와 같습니다.

weekdays = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday']

 

list() 함수를 사용하면 다른 데이터 타입을 list 구조로 변환할 수 있습니다.

>>> list('cat') 
['c', 'a', 't']

>>> a_tuple = ('red', 'green', 'blue')
>>> list(a_tuple)
['red', 'green', 'blue']

 

순서가 있기 때문에 인덱스를 통해 값을 추출할 수 있습니다.

>>> marxes = ['Groucho', 'Chico', 'Harpo']
>>> marxes[0:2]
['Groucho', 'Chico']

 

list 끝에 새 원소를 추가할 수 있습니다.

>>> marxes.append('Zeppo')
>>> marxes
['Groucho', 'Chico', 'Harpo', 'Zeppo']

 

list간의 병합도 가능합니다.

>>> marxes = ['Groucho', 'Chico', 'Harpo', 'Zeppo']
>>> others = ['Gummo', 'Karl']
>>> marxes.extend(others)
>>> marxes
['Groucho', 'Chico', 'Harpo', 'Zeppo', 'Gummo', 'Karl']

 

원하는 오프셋에 원소를 추가하는 것도 가능합니다.

>>> marxes.insert(3, 'Gummo')
>>> marxes
['Groucho', 'Chico', 'Harpo', 'Gummo', 'Zeppo']

 

원소가 필요없다면 해당 원소를 제거할 수 있습니다.

>>> marxes.remove('Zeppo')
>>> marxes
['Groucho', 'Chico', 'Harpo', 'Gummo']

 

해당 원소의 오프셋이 궁금하다면 index() 함수를 이용하면 됩니다.

>>> marxes.index('Chico')
1

 

list에서 어떤 값이 존재하는지 확인하고 싶다면 in 연산자를 사용합니다.

>>> 'Groucho' in marxes
Ture

 

list의 원소가 몇 개인지 확인하고 싶다면 count() 함수를 사용합니다.

>>> marxes.count('Harpo')
1

 

list 구조를 문자열 구조로 변경하고 싶다면 join() 함수를 사용합니다.

>>> ', '.join(marxes)
'Groucho, Chico, Harpo, Gummo'

 

list를 정렬하고 싶다면 sort() 함수를 사용합니다.

>>> tmp = [5, 2, 3, 4, 1]
>>> tmp.sort()
[1, 2, 3, 4, 5]

 

list의 총 원소의 개수를 알고 싶다면 len() 함수를 사용합니다.

>>> len(tmp)
5

 

list를 복사하고 싶다면 copy() 함수를 사용합니다.

>>> b = tmp.copy()
>>> b
[1, 2, 3, 4, 5]   # 다른 객체입니다.

 

 

 

tuple 자료구조


tuple(튜플)은 쉽게 말해 상수형 리스트입니다. 즉, 추가, 삭제, 수정을 할 수 없는 list 자료구조입니다.

 

튜플은 다음과 같은 방법으로 생성됩니다.

>>> empty_tuple = ()
>>> empty_tuple
()
>>> one_marx = 'Groucho',  # 원소가 1개인 튜플이라면 뒤에 ,(콤마)를 붙여줘야합니다.
>>> one_marx
('Groucho',)
>>> marx_tuple = 'Grouple', 'Chico', 'Harpo'
>>> marx_tuple
('Groucho', 'Chico', 'Harpo')

 

튜플은 한 번에 여러 변수에 할당할 수 있습니다. 이것을 '튜플 언패킹(tuple unpacking)'이라고 부릅니다.

>>> marx_tuple = ('Groucho', 'Chico', 'Harpo')
>>> a, b, c = marx_tuple
>>> a
'Groucho'
>>> b
'Chico'
>>> c
'Harpo'

 

다른 객체를 튜플로 만들고 싶다면 tuple() 함수를 사용합니다.

>>> marx_list = ['Groucho', 'Chico', 'Harpo']
>>> tuple(marx_list)
('Groucho', 'Chico', 'Harpo')

 

 

 

dictionary 자료구조


딕셔너리는 map 자료구조라 보면 됩니다. key-value 쌍을 원소로 가집니다. 딕셔너리는 중괄호{}로 나타냅니다. 첨자 연산자[]를 사용할 수 있는데, 다만 [] 연산자 안에는 인덱스가 아닌 key 값이 들어가야합니다.

>>> bierce = {
        "day": "A period of twenty-four hours, mostly misspent",
        "positive": "Mistaken at the top of one's voice",
        "misfortune": "The kind of fortune that never misses",
        }

 

2개의 값으로 이뤄진 객체라면 딕셔너리 구조로 변환할 수 있습니다.

>>> a = [ ['a', 'b'], ['c', 'd'], ['e', 'f'] ]
>>> dict(a)
{'c': 'd', 'a': 'b', 'e': 'f'}  # 딕셔너리 자료구조는 순서가 의미가 없기 때문에 임의적입니다.

 

원소를 추가/변경하고 싶다면 간단히 [] 연산자를 사용합니다.

>>> pythons = {
        'Chapman': 'Graham',
        'Cleese': 'John',
        'Idle': 'Eric',
        'Jones': 'Terry',
        'Palin': 'Michael',
        }
>>> pythons['Gilliam'] = 'Terry'  # 첨자 연산자를 이용해 간단히 원소를 추가할 수 있습니다.

 

2개의 딕셔너리를 결합하고싶다면 update() 멤버 함수를 사용합니다.

>>> others = { 'Marx': 'Groucho', 'Howard': 'Moe' }
>>> pythons.update(others)
>>> pythons
{ 'Chapman': 'Graham', 'Cleese': 'John', 'Idle': 'Eric','Jones': 'Terry', 'Palin': 'Michael', 'Marx': 'Groucho', 'Howard': 'Moe' }

 

del 연산자를 이용해 해당 원소를 삭제할 수 있습니다.

>>> del pythons['Marx']
>>> del pythons['Howard'] # 결합해서 추가된 원소를 제거합니다.

 

모든 원소를 삭제하고싶다면 clear() 멤버 함수를 사용합니다.

>>> pythons.clear()
>>> pythons
{}

 

딕셔너리의 모든 key 값을 얻고싶다면 keys() 멤버 함수를 사용합니다.

>>> signals = {'green': 'go', 'yellow': 'go faster', 'red': 'smile for the camera'}
>>> signals.keys()
dict_keys(['green', 'red', 'yellow']) # dict_keys() 객체를 반환합니다.

 

딕셔너리의 모든 value 값을 얻고싶다면 values() 멤버 함수를 사용합니다.

>>> list(signals.values())
['go', 'smile for the camera', 'go faster']

 

딕셔너리의 모든 key-value 값을 얻고싶다면 items() 멤버 함수를 사용합니다.

>>> list(signals.items())
[('green', 'go'), ('red', 'smile for the camera'), ('yellow', 'go faster')]

 

딕셔너리를 복사하고 싶다면 copy() 멤버함수를 사용합니다.

>>> original_signals = signals.copy()
>>> original_signals
{'green': 'go', 'yellow': 'go faster', 'red': 'smile for the camera'}

 

 

'Programming > Python' 카테고리의 다른 글

[Python] 파일 입출력  (0) 2019.06.11
[Python] private 네임 맹글링  (0) 2019.06.10
[Python] 클래스(class)  (0) 2019.06.10
[Python] 클로저(Closure)  (0) 2019.06.07
[Python] 컴프리헨션(Comprehension)  (0) 2019.06.07