본문 바로가기

Programming languages/Python

2. Data Type(List & Tuple)

728x90
반응형

<List>

 

리스트는 자료구조 수업에서 들어봤다.

배열은 인덱스를 가진 데이터 집합이고 리스트는 순차적으로 저장된 데이터의 집합이다.

리스트는 메모리에 분산 저장되고 배열은 연속적이다.

가장 큰 특징은 리스트는 중간에 데이터 삽입 삭제가 쉽다.라고 기억하고 있다.

 

다만 파이썬의 리스트는 위와 조금 다르다.

메모리 상의 연속적인 위치에 배치되고 인덱스를 사용하여 접근이 가능하다.

 

리스트명 = [요소1, 요소 2, 요소 3...] 이런 식으로 표현한다. [ ] 안에 들어간다는 사실이 중요하다.

a = [] # a=list() 와 동일하다.
b = [1,2,3]
c = ['holy','moly','OMG']
d = [1,2,'holy','moly']
e = [1,2,['holy','moly']]

a 같은 경우 빈 리스트이고 데이터 형을 섞어서 리스트를 만들 수도 있다. 그리고 e처럼 리스트 안에 리스트를 요소로 가질 수 있다.

또한 a같은 경우 함수를 이용해서 빈 리스트를 만들 수 도 있는데 a = list()이다.

a = [1,2,3,[4,5],'OMG',['holy','moly']]

print(a[1])
print(a[3][1]+a[1])
print(a[4]+'!!')
print(a[5][0])
print(a[-1])
print(a[-3])

위와 같이 인덱싱도 가능하고 연산도 가능하다. 차례대로 2,7, OMG!!, holy 가 나올 것이다. 문자열에 덧셈으로는 정수형을 더해주는 것이 불가능하고 문자 혹은 문자열만 가능하다. 인덱싱 해서 리스트의 요소 값끼리의 연산도 가능하다.

c언어의 2차원 배열과 비슷하게 리스트 안에 리스트의 요소를 가져올 수 있다.

위에 a에서 'holy'를 가져올 경우 먼저 ['holy', 'moly']가 a [5]라는 사실을 알아야 한다.

우리는 a [5] 안에 있는 첫 번째 요소를 가져오고 싶은 것이기 때문에. a [5][0]을 호출한다. 

print(a [-1])을 적으면 제일 뒤에 있는 요소가 튀어나온다. 굉장히 직관적이지 않은가?

첫 번째 요소가 0으로 시작하니 -1번째 요소를 호출하면 맨 마지막 요소가 튀어나온다.

뱀이 자기 꼬리를 물고 있는 것을 상상하면 이해가 쉽다. 위를 이해했다면 a[-3]도 직관적으로 떠 올릴 수 있다.

a[-1]은 ['holy', 'moly']가 나올 것이고, a[-3]은 [4,5]가 나올 것이다. 

응용해 보면 a[-1][0] == a[5][0] 이라는 것을 알 수 있다.

삼중 리스트 에서의 인덱싱도 위 과정과 크게 다를 것 없다.

먼저 가장 첫 번째 요소의 위치를 적고 첫번째 안에 두 번째 요소의 위치를 적고 최종적으로 찾고자 하는 데이터 요소의 위치를 적으면 된다.

a[x][y][z] 이런 식으로 말이다. 다만 이러면 혼란스럽기 때문에 사용이 권장되는 방식은 아니다.

 

a = [1,2,3,[4,5],'OMG',['holy','moly']]

print(a[0:3])
print(a[2:5])
print(a[:4])
print(a[4:])

위처럼 리스트도 슬라이싱이 가능하다.

결과는 각각 아래와 같이 나온다.

[1, 2, 3]
[3, [4, 5], 'OMG']
[1, 2, 3, [4, 5]]
['OMG', ['holy', 'moly']] 

print(a[3[0]:6])

혹시 궁금해서 끝나거나 시작하는 지점을 리스트 안에 리스트 요소로 해도 되나 해보았는데 오류가 났다.

아마 3[0]을 리스트의 n번째 요소로 인식하는 것이 아니라 3[0]에 들어있는 4라는 정수 값 자체로 인식해서 작동하지 않는 것 같다.

다시 생각해보면 슬라이싱은 'a라는 이름을 가진 리스트'의 n번째부터 m번째 까지 잘라주는 기능을 하는 것이니 안되는 것이 당연한 것이다.

print(a[3][:2])

단 이런 경우에는 잘 작동한다. 당연한 것이 슬라이싱이 되는 주체가 중첩되어 있는 'a[3] 라는 이름을 가진 리스트'라서 그렇다.

a = [1,2,3,[4,5],'OMG',['holy','moly']]

a = a + [6,7,8] + ['Doughnut']

print(a)

위와 같은 경우 특징이 한 가지 있다. 리스트 형에는 리스트 형만 더 해줄 수 있다. +6을 적거나 +'Doughnut' 이렇게 적으면 오류를 뿜어낸다. 리스트에는 리스트만 더 할 수 있다. 다른 연산도 되냐는 궁금증도 생길 수 있다. 우선 리스트와 리스트의 연산은 덧셈만 가능하다. 리스트에 *n을 하면 n번 반복 출력된다. 나눗셈이나 나머지 연산은 불가능하다.

 

 = [1,2,3,[4,5],'OMG',['holy','moly'],"6"]

print(len(a)) #리스트의 크기

print(2 + 'hi') #오류 작동하지 않음
print('2' + 'hi') # 2hi를 출력
print(a[1]+ 'hi') #오류 작동하지 않음
print('a[1]' + 'hi') #오류가 작동하지는 않으나 a[1]hi로 출력됨.
print(str(a[1])+ 'hi') #2hi를 출력

print(a[6] + 'hi') #6hi를 출력
print(int(a[6])+4) #10을 출력

위와 같이 len()을 사용하면 'a라는 이름을 가진 리스트'의 크기를 알 수 있다. a[0] 부터 a[5]까지 존재하므로 len(a)의 값은 6이 된다.

우리가 앞에서 문자열에 정수형을 더하고 싶을 때는 숫자를 문자로 인식시켜주면 됐다. 다음과 같다. 따라서 리스트의 요소를 가져다가 다른 자료형과 함께 사용할 땐 반드시 형 변환을 사용해줘야 한다. 위에서는 정수를 문자형으로 형 변환하는 것과 문자형을 정수로 형 변환하는 것을 해보았다. int(), str(), double(), char() 등으로 사용하면 될 것 같다.

 

a = [1,2,3,4,5]

a[2] = 7 #수정
del a[1] # del
del a[3:] #del 슬라이싱
a.append(6) #append 요소 맨뒤에 추가
a.append([7,8])#append list 맨 뒤에 추가 

print(a)

위와 같은 결과를 실행하면 [1,7,4,6,[7,8]] 가 된다. 리스트의 요소를 수정하는 것은 위 코드만 봐도 직관적으로 알 수 있다.

del a[n] 일하면 리스트 a의 n번째에 있는 요소를 지울 수 있다. 슬라이싱도 적용해서 del 함수를 사용한 것을 볼 수 있다.

리스트명.append(요소) 는 리스트의 맨 뒤에 요소를 추가하는 것이다. 요소는 물론 리스트도 추가 가능하다.

중요한 것은 특정 위치를 지정하는 것이 아니라 맨 뒤에 들어간다는 것이다.

 

x = ['e', 'c', 'f', 'b', 'd', 'a', 'f']

x.sort() #순서대로 정렬
print(x)

x.reverse() #역순 정렬
print(x)

a = x.index('c') #리스트 안에 해당 값이 있으면 몇번째 요소 인지 반환
print(a)

x.insert(6,'g') #n번째에 k 삽입
print(x)

x.remove('f') #첫번째로 나오는 요소의 값 삭제
print(x)

print(x.pop(3)) #n번째 요소를 반환하고 삭제
print(x)

print(x.count('a')) #리스트 안에 존재하는 해당 요소의 개수를 카운트 해서 반환

x.extend(['h','i']) #리스트에 리스트를 추가하는 것이 아닌 자연스럽게 합치는것 add()와 다름 
print(x)

x = x + ['j','k','l'] #x.extend(['j','k','l])과 동일함
print(x)

위의 연산 결과는 다음과 같다.

['a', 'b', 'c', 'd', 'e', 'f', 'f']
['f', 'f', 'e', 'd', 'c', 'b', 'a']
4
['f', 'f', 'e', 'd', 'c', 'b', 'g', 'a']
['f', 'e', 'd', 'c', 'b', 'g', 'a']
c
['f', 'e', 'd', 'b', 'g', 'a']
1
['f', 'e', 'd', 'b', 'g', 'a', 'h', 'i']

['f', 'e', 'd', 'b', 'g', 'a', 'h', 'i', 'j', 'k', 'l']

 

좀 비중 있게 봐야 하는 건 pop() 과 extend() 같다. pop는 특정 숫자를 반환하고 삭제한다.

일회성(휘발성)으로 함수를 구현하거나 할 때 사용하면 좋을 것 같다.

extend()는 add()와 다르게 리스트 안에 요솔 리스트를 넣는 것이 아니다.

자연스럽게 두 개의 리스트를 이어 붙이는 것이라고 생각하면 된다. 

extend는 리스트끼리의 '+' 연산과 같다.

 

<Tuple>

 

튜플은 multipiler라고 부르는 영어의 수 체계이다. 의미상 '몇 배'라는 의미를 포함한다.

Single, Double, Triple 이 튜플체계에서 등장하는 단어이다.

 

t1 = (1,2,3,4,5,'a','b','c')
t2 = (3,)
t3 = 6,7,8,9
t4 = 5,

print(t1[6]) #튜플 인덱싱 
print(t1[0:5]) #튜플 슬라이싱
print(t1 + t3) # 튜플 이어붙이기
print(len(t1)) #튜플 t1의 크기

위의 연산 결과는 다음과 같다.

b
(1, 2, 3, 4, 5)
(1, 2, 3, 4, 5, 'a', 'b', 'c', 6, 7, 8, 9)
8

 

위는 튜플을 구현한 것이다.

튜플은 리스트와 비슷하게 자료 덩어리지만 다른 것이 있다.

리스트는 요소를 묶을 때 [ ]를 사용하고 튜플은 ( )를 쓰거나 아무것도 쓰지 않고 자료만 나열한다.

위의 t1, t2, t3, t4 모두 튜플이다. 그리고 튜플은 하나만 쓸 때도 뒤에 , 를 붙이는데 이는 아마 이를 통해  

t4 = 5는 튜플이 아니고 t4 = 5, 는 튜플로 보기 위함일 것이라고 추측된다.

튜플은 요소 값을 삭제하거나 변경할 수 없다는 것도 리스트와 큰 차이점이다.

요소 값이 바뀌는 것이 걱정되거나 바뀌면 안 되는 기능을 구현할 때 튜플을 사용하면 된다. 

728x90
반응형

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

Examples) Chapter 1&2  (0) 2021.12.07
4. Data Type(Bool & Variable)  (0) 2021.12.07
3. Data Type(Dictionary & Set)  (0) 2021.12.06
1. Basic & Data Type(Number, String)  (0) 2021.12.06
Let me know about "Python"  (0) 2021.12.06