안녕하세요 여몽의 눈동자입니다.
이번에는 파이썬 데이터 구조에 대해 이야기해 보겠습니다. 이번 포스트에서는 우선 파이썬에서 기본적으로 제공하고 있는 데이터 구조인 list, tuple, dictionary 그리고 string에 대해 알아보겠습니다.
1. 리스트 (List)
리스트는 여러 개의 값을 가질 수 있는 개체입니다. 리스트의 시작과 끝은 대괄호로 나타내고 각 원소(item)는 컴마(,)로 구분합니다. 리스트내의 요소는 숫자, 문자 또는 다른 리스트 등 다양하고 꼭 한 종류의 원소만 가질 필요도 없습니다.
a = [1,2,3,4,5]
b = ['hello', 5, 2.3, 2+3j]
In [1]: a
Out[1]: [1, 2, 3, 4, 5]
In [2]: b
Out[2]: ['hello', 5, 2.3, (2+3j)]
리스트의 이름 옆에 대괄호를 이용하여 리스트 안의 원소를 불러올 수 있습니다.
In [3]: a[0]
Out[3]: 1
In [4]: a[2]
Out[4]: 3
In [5]: b[0]
Out[5]: 'hello'
In [6]: b[3]
Out[6]: (2+3j)
보시면 아시겠지만 인덱스는 0부터 시작합니다. 따라서 리스트 a의 첫번째 원소를 불러오기 위해서는 0을 지정합니다.
리스트 개별원소의 값을 바꾸는 것도 물론 가능합니다.
In [7]: a[2] = 'dog'
...: a
Out[7]: [1, 2, 'dog', 4, 5]
In [8]: b[1] = b[1]+2
In [9]: b
Out[9]: ['hello', 7, 2.3, (2+3j)]
- 리스트 잘라내기
리스트 내의 원소 일부를 잘라내기 할 수도 있습니다. (slicing lists) 이때는 콜론(:)을 사용합니다.
In [11]: a[1:3]
Out[11]: [2, 'dog']
콜론의 왼쪽은 잘라내기할 시작원소 (여기서는 두번째 원소, 인덱스 시작이 0이므로) 그리고 콜론의 오른쪽은 잘라내기할 마지막원소의 다음원소 (즉, a[3]인 4는 포함되지 않습니다.)를 지정해줍니다. 여기서는 리스트 a의 두번째에서 시작해서 세번째 원소까지 잘라내기 한 것을 볼 수 있습니다.
콜론 왼쪽에 들어갈 수가 0 인 경우(즉, 첫번째 원소부터 잘라내는 경우) 그리고 콜론 오른쪽의 수가 리스트 전체 길이인 경우 (즉 마지막 원소까지 잘라내는 경우) 생략할 수 있습니다.
In [12]: b[:]
Out[12]: ['hello', 7, 2.3, (2+3j)]
인덱스에 음수가 붙으면 리스트의 마지막 원소로부터 몇번째인지를 나타냅니다. 즉 -1은 리스트의 마지막원소 -2는 리스트의 마지막 두번째 원소를 나타냅니다.
In [14]: b[-3:2]
Out[14]: [7]
리스트 b의 마지막으로부터 3번째 원소는 7입니다. 여기서부터 b리스트의 두번째 원소까지 잘라내라는 의미이므로 (이 경우 역시 7) 반환값은 7이 됩니다.
물론, 매 n번째의 원소를 잘라낼 수도 있는데 이때는 콜론을 2번 이용하게 됩니다. 즉
[시작점:종료점:간격] 이렇게 지정해서 잘라냅니다.
In [20]: a[0:3:2]
Out[20]: [1, 'dog']
위의 예를 보시면 첫번째 원소부터 네번째 원소까지 매 2개 간격으로 잘라내라는 명령입니다. 아래의 예는 리스트의 마지막까지 매 2개 간격으로 잘라낸 모습입니다.
In [21]: a[0::2]
Out[21]: [1, 'dog', 5]
- 다차원 리스트의 인덱싱
리스트 안의 원소가 다른 리스트인 경우 대괄호를 반복적으로 사용하여 개별 원소를 호출할 수 있습니다.
In [48]: b = [[1,2,[3,4,5]],['cat','dog','horse']]
In [49]: b[0][1]
Out[49]: 2
In [50]: b[0][2][0]
Out[50]: 3
In [51]: b[1][2]
Out[51]: 'horse'
- 리스트의 연결과 복사
+ 연산자는 리스트 두개를 붙이는 역할을 하고, * 연산자는 리스트를 해당 갯수많큼 복사하는 역할을 합니다.
In [32]: [1,2,3] + ['a','b','c']
Out[32]: [1, 2, 3, 'a', 'b', 'c']
In [33]: ['a','b','c']*3
Out[33]: ['a', 'b', 'c', 'a', 'b', 'c', 'a', 'b', 'c']
- 리스트내 원소 지우기
명령어 del을 이용해서 리스트내 원소를 삭제할 수 있습니다.
In [38]: del a[1]
In [39]: a
Out[39]: [1, 'dog', 4, 5]
2. 튜플 (Tuple)
튜플은 원소의 변경이 불가한(immutable) 리스트입니다. 즉 한번 정의가 되면 튜플내의 개별원소를 변경하는 것이 불가능합니다. 튜플의 시작과 끝은 괄호로 나타냅니다. 튜플내의 원소는 리스트와 마찬가지로 대괄호를 통해 불러올 수 있지만 그 값을 변경할 수 는 없습니다. 그 밖의 특성은 리스트와 유사합니다. 아래의 예를 보시면 이러한 튜플의 특성이 잘 나타나 있습니다.
In [40]: c = (1,2,3,4,5,6,7,8)
In [41]: c[1] = 0
Traceback (most recent call last):
File "<ipython-input-41-47aab76fc0ff>", line 1, in <module>
c[1] = 0
TypeError: 'tuple' object does not support item assignment
41번줄에 보시면 튜플 c의 2번째 원소 즉 2를 0으로 변경하려 시도하였지만 에러가 발생함을 볼 수 있습니다.
따라서 프로그램 내에서 변경되어서는 안될 값들을 저장할 때 이 튜플을 이용하는 것이 더 안전합니다.
3. 딕셔너리 (Dictionary)
딕셔너리도 리스트와 비슷하지만 정수 값 이외의 다양한 인덱스를 사용할 수 있다는 점에서 차이가 있습니다. 즉 리스트의 각원소들은 순서대로 배열이 되어있고 순서에 따른 정수값의 인덱스를 통해 값을 호출하는 반면 딕셔너리의 경우 각 원소들간의 순서라는 개념이 없고 키(key) 라고 부르는 인덱스를 통해 값을 불러옵니다. 그리고 각각의 키에 해당하는 데터 값(value) 이 매치됩니다. 딕셔너리의 시작과 끝은 중괄호({})로 나타냅니다.
예를 들어 다음과 같이 딕셔너리를 만들 수 있습니다. 딕셔너리의 키(key)와 그 값은 콜론(:) 으로 구별되며 각 원소들은 콤마(,)로 구별된다는 것을 알 수 있습니다. 딕셔너리의 키가 꼭 문자일 필요는 없습니다.
In [45]: Minsoo = {'weight':'65', 'height':'170', 'hair':'black', 'age':'17'}
각 원소의 값을 불러올 때는 키를 이용합니다.
In [46]: Minsoo['age']
Out[46]: '17'
이미 있는 딕셔너리에 새로운 값을 추가할 때도 역시 키를 지정해야 합니다.
In [47]: Minsoo['gender'] = 'male'
In [48]: Minsoo
Out[48]:
{'weight': '65',
'height': '170',
'hair': 'black',
'age': '17',
'gender': 'male'}
4. 스트링 (String)
말 그대로 문자형 데이터를 가리킵니다. 문자형 데이터의 시작과 끝은 큰따옴표 또는 작은따옴표를 이용합니다.
In [6]: a = "민수의 저녁메뉴는"
In [7]: b = '햄버거 이다'
+ 연산자는 스트링 데이터를 붙여서 새로운 스트링 데이터를 만드는 역할을 합니다.
In [8]: c = a + " " + b
In [9]: c
Out[9]: '민수의 저녁메뉴는 햄버거 이다'
* 연산자는 스트링 데이터를 반복적으로 붙이는 역할을 합니다.
In [24]: c = a*3
In [25]: c
Out[25]: '민수의 저녁메뉴는민수의 저녁메뉴는민수의 저녁메뉴는'
스트링 값의 각각의 문자는 대괄호를 통해 호출 할 수 있습니다.
In [28]: a
Out[28]: '민수의 저녁메뉴는'
In [29]: a[0]
Out[29]: '민'
대괄호 안에 음수를 사용하는 경우 스트링의 마지막에서부터 역으로 호출하게 됩니다. 즉 스트링값의 마지막에서 세번째 원소를 호출하는 경우 아래와 같습니다.
In [30]: a[-3]
Out[30]: '메'
댓글
댓글 쓰기