TanzDev

TIL 21 (자료형 종료) 본문

기록보드/TIL

TIL 21 (자료형 종료)

Tanz-dev 2024. 2. 21. 21:31

금일은 리스트, 튜플 및 추가적으로 공부한 내용을 작성하려고한다.

기존에 파이참을 사용해서 진행했는데, 노트북이 8기가라 메모리 사용량이 많이 예민해지다보니 파이참이 vscode보다 무겁기때문에 이번 TIL에선 VSCODE로 진행할 예정이다.

 

리스트와 튜플은 비슷하지만 확실한 차이가 있는데,

  • 리스트는 [], 튜플은 ()으로 둘러싼다.
  • 리스트는 요솟값의 생성, 삭제, 수정이 가능하지만, 튜플은 요솟값을 바꿀 수 없다

리스트 기본문법

a = [1, 2, 3]
print(a[1] + a[2]) #a의 인덱스 1번째 + a의 인덱스 2번째 합해서 5가 출력

 

리스트엔 자료형도 대입해줄 수 있다.

a = [1, '2', '3']
print(a[1] + a[2]) #a의 인덱스 1번째 + a의 인덱스 2번째 합해서 23(자료형) 출력
a = [1, '2', '3']
print(a[-1]) # -1도 대입해줄수있는데 이것역시 거꾸로 출력해준다. 3 출력

 

리스트는 스트링이랑 비슷하게 인덱싱이 이루어진다.

a = [1, 2, 3, ['a', 'b', 'c']] # 리스트 안에 또 리스트를 만들어줄 수 있다 다른 리스트를 만들어줄때 ,를 유의하자
# 0, 1, 2는 1,2이 출력되고 리스트안의 리스트는 3번 인덱스로 되어있다.
print(a[3][1]) # 출력하게되면 b가 출력되어지게된다. (리스트안에 리스트는 다시 0부터 시작)

 

a = [1, 'hello', 3, ['a', 'b', 'c']]
# 리스트 안에 1번 인덱스는 hello이다.
print(a[1][0]) #hello의 인덱스 중 0번째를 선택해주면 출력은 h가 나오게된다.

 

리스트의 슬라이싱

a = [1, 2, 3, 4, 5]
print(a[0:2])#슬라이싱을 사용할 경우 인덱스 0번 이상, 인덱스 2번 미만이기때문에 1, 2 출력

 

슬라이싱의 기본은 문자열과 동일하므로 응용해보면 될거같다.

a = [1, 2, 3, ['a', 'b', 'c'], 4, 5]
print(a[2:5]) #인덱스 2번 이상, 5번 미만이므로 [3, ['a', 'b', 'c'], 4] 출력

 

중요하게 쓰이는 개념이므로 복습해두자.

리스트의 연산

더하기

a = [1, 2, 3] # 서랍 a와
b = [4, 5, 6] # 서랍 b가
print(a + b) # 더해지면 [1, 2, 3, 4, 5, 6] 로 출력된다.

 

곱하기(반복하기)

a = [1, 2, 3] # 서랍 a와
b = [4, 5, 6] # 서랍 b가
print(a * 3) # 곱해지면 [1, 2, 3, 1, 2, 3, 1, 2, 3] 로 출력된다.

 

리스트의 길이구하기

a = [1, 2, 3, 5]
print(len(a)) # 인덱스가 4개 있으므로, 4가 출력된다.

 

형태가 다를경우 (int, str)

a = [1, 2, 3]
print(a[2] + "hi") # 인덱스 2번은 3인데 정수형이고, hi는 문자열이기때문에 더해질 수 없어 오류가난다.

 

따라서 

a = [1, 2, 3]
print(str(3) + "hi") # 따라서 3을 문자열로 변경해주는 str을 사용해주면 3hi가 출력된다

 

리스트의 수정과 삭제 

a = [1, 2, 3]
a[2] = 4 # 2번째 인덱스를 4로 변경해준다

print(a) # 출력 1, 2, 4

 

del 함수를 사용해 삭제하기

a = [1, 2, 3]
del a[1] # 첫번째 인덱스를 삭제해준다.

print(a) # 출력 1, 3

 

del 함수를 이용해서 슬라이싱으로 삭제하기

a = [1, 2, 3, 4, 5]
del a[2:] # 2번째 인덱스부터 끝까지 지워준다.

print(a) #  [1, 2]

 

리스트의 요소 추가하기 - append

a = [1, 2, 3, 4, 5]
a.append(6) # 6를 추가해준다.

print(a) # [1, 2, 3, 4, 5, 6] 출력

 

리스트의 정렬 - sort

a = [1, 5, 4, 2, 3]
a.sort() # 오름차순으로 정렬

print(a) # [1, 2, 3, 4, 5] 출력

 

리스트의 뒤집기 - reverse [우측에서 순서대로 읽어드림]

a = [1, 5, 4, 2, 3]
a.reverse() # 뒤집어서 불러드림

print(a) # [3, 2, 4, 5, 1] 출력

 

여기에 sort 명령어를 사용해주면 내림차순으로 정렬시킬 수 있다.

a = [1, 5, 4, 2, 3]
a.sort()
a.reverse() # 내림차순으로 정렬

print(a) # [5, 4, 3, 2, 1] 출력

 

인덱스 반환 - index

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

print(a.index(5)) # 5는 두번째 index이므로 1이 출력된다.

 

리스트에 요소 삽입 - insert

몇번째 인덱스에  어떤 값을 넣겠다고 순서를 정해주는데, 그곳에 삽입할 수 있다.

a = [1, 5, 4, 2, 3]
a.insert(2, 10) # 2번째 인덱스에 10을 삽입 #( {특정 인덱스}, {삽입할 값} )
print(a) # 5는 두번째 index이므로 [1, 5, 10, 4, 2, 3] 출력된다.

 

리스트 요소 제거 - remove

리스트 내부에 특정한 값을 없애주는데, 리스트 인덱스 0부터 탐색 후 가장 먼저 들어오는 값을 제거해준다.

a = [1, 5, 4, 2, 3, 4, 2, 4, 5]
a.remove(2) # index 3에 위치한 2를 제거
print(a) # [1, 5, 4, 3, 4, 2, 4, 5] 가 출력된다.

 

리스트 요소 끄집어 내기 - pop

 

특정 index를 꺼낼 수 있지만, 특정해주지않으면 맨 끝의 값을 꺼내준다.

a = [1, 2, 3]

print(a.pop(2)) # 2번째 index의 3을 끄집어냈다.

print(a) # 출력은 3 [1, 2]

 

리스트 포함된 요소 x의 개수 세기 - count

a = [1, 2, 3, 4, 1, 3]
print(a.count(1)) # x값이 1이므로 LIST에 1은 두개다. 따라서 2가 출력된다.

 

리스트 확장 - extend

append는 리스트라는 서랍장안에 다른 서랍장을 추가로 만들어주는 반면, extend는 서랍장 안 공간에 추가적으로 값을 넣어준다.

 

a = [1, 2, 3, 4]
a.extend([5, 6])

print(a) #설명대로 기존 리스트 a안에 5,6을 추가해준다.
# 따라서 출력은 [1, 2, 3, 4, 5, 6]


b = [1, 2, 3]
b.append([4, 5, 6]) # 설명대로 기존 리스트 b안에 4,5,6이라는 서랍장을 추가로 만들어준다.
print(b) #따라서 출력은 [1, 2, 3, [4, 5, 6]]

 

이렇게 파이썬 리스트에 대한 개념에 대해 공부를 했다.

간단하게 이해하고 넘어가도 될 부분인데, 모르면 사용할 수도 없다보니 하나하나 찾아가며 사용해보고 몸에 익히느라

수업진행이 조금 딜레이되고있어서 조금 속도를 더 내봐야될거같다.

 

튜플

튜플은 잠긴 서랍장의 개념이며, 변형되지않는다.

 

다만 인덱싱과 슬라이싱이 가능하고

 

기초적인 내용은 상단에 리스트와 비슷하다. (대신 변경하는 문구는 사용 x)

 

t1 = ()
t2 = (1,)
t3 = (1, 2, 3)
t4 = 1, 2, 3
t5 = ('a', 'b', ('ab', 'cd'))
# 튜플의 기본

 

딕셔너리 (사전의 특징을 가지고 있음)

조코딩 유튜브

딕셔너리는 API에 자주 활용됨

 

딕셔너리는 리스트나 튜플처럼 순차적으로(sequential) 해당 요솟값을 구하지 않고 Key를 통해 Value를 얻는다. 이것이 바로 딕셔너리의 가장 큰 특징이다. baseball이라는 단어의 뜻을 찾기 위해 사전의 내용을 순차적으로 모두 검색하는 것이 아니라 baseball이라는 단어가 있는 곳만 펼쳐 보는 것이다.

dic = {'name': 'pey', 'phone': '010-9999-1234', 'birth': '1118'}
# 딕셔너리의 기본구조
print(type(dic)) # class 'dict'

 

Value에 리스트도 넣을 수 있고, 여러개 넣을 수 있다.

딕셔너리에 쌍 추가하기

a = {1: 'a'}
a[2] = 'b' #키와 밸류를 추가해줄 수 있다
print(a)# 출력 {1: 'a', 2: 'b'}
a = {1: 'a'}
a['Adam'] = 'Eve' # 문자열도 가능
print(a) #{1: 'a', 'Adam': 'Eve'} 출력
a = {1: 'a'}
a['age'] = [11,34,22,7] # list도 추가할 수 있다.
print(a)  #{1: 'a', 'age': [11, 34, 22, 7]} 출력

 

딕셔너리 삭제하기

a = {2: 'b', 'name': 'pey', 3: [1, 2, 3]}
del a['name'] # key로 선택가능하며 'name'을 키로 del 명령어로 지워줄 수 있다.
print(a) #{2: 'b', 3: [1, 2, 3]} 출력된다.

 

추가적으로 여러개를 삭제하고싶으면, key 값에 여러개의 값과 , 를 이용해주면 여러개의 값을 삭제할 수 있다.

 

딕셔너리 사용시 주의사항

 

a = {1:'a', 1:'b'} # key값이 중복되면
print(a) # {1: 'b'}가 출력되는데, 이는 a가 b에 중복되기때문이므로 key값은 중복시키면 안된다.

 

1가지 주의해야 할 점은 Key에 리스트는 쓸 수 없다는 것이다. 하지만 튜플은 Key로 쓸 수 있다. 딕셔너리의 Key로 쓸 수 있느냐, 없느냐는 Key가 변하는(mutable) 값인지, 변하지 않는(immutable) 값인지에 달려 있다. 리스트는 그 값이 변할 수 있기 때문에 Key로 쓸 수 없다. 다음 예처럼 리스트를 Key로 설정하면 리스트를 키 값으로 사용할 수 없다는 오류가 발생한다.

 

딕셔너리 관련 함수

키 리스트 만들기 - .keys() - key값만 모아서 하나의 리스트(dict_keys)로 만들어주는 명령어

a = {'name': 'pey', 'phone': '010-9999-1234', 'birth': '1118'}
print(a.keys()) #dict_keys(['name', 'phone', 'birth']) 출력

 

밸류 리스트 만들기 - .values() - value값만 모아서 하나의 리스트(dict_values)로 만들어주는 명령어 

a = {'name': 'pey', 'phone': '010-9999-1234', 'birth': '1118'}
print(a.values()) #dict_values(['pey', '010-9999-1234', '1118']) 출력

 

key와 values를 쌍으로 얻는 방법 : .items() - key와 value가 tuple에 들어가서 리스트(dict_items)를 만들어주는 명령

a = {'name': 'pey', 'phone': '010-9999-1234', 'birth': '1118'}
print(a.items())
#dict_items([('name', 'pey'), ('phone', '010-9999-1234'), ('birth', '1118')]) 출력

 

key와 values를 쌍으로 지우는 방법 : .clear()

a = {'name': 'pey', 'phone': '010-9999-1234', 'birth': '1118'}
a.clear()

print(a) # {} 출력

 

Key로 Value 얻기 - .get

a = {'name': 'pey', 'phone': '010-9999-1234', 'birth': '1118'}

print(a.get('name')) # pey가 출력된다.

# 대괄호에 key를 넣는 방식으로 없는 key라면 에러가 나게 되는데
# get방식으로 key를 넣는다면, 에러가 나지않고 None이 출력되게된다.
a = {'name': 'pey', 'phone': '010-9999-1234', 'birth': '1118'}

print(a.get('fullname', "There is no key")) # 값이 없는경우엔 , 후에 내용을 적어줄 수 있다.

# There is no key 출력

 

해당 Key가 딕셔너리 안에 있는지 조사하기 - in

a = {'name':'pey', 'phone':'010-9999-1234', 'birth': '1118'}

print('name' in a) # name이 있으면 True 출력
print('fullname' in a) # name이 있으면 False 출력

 

다른 딕셔너리와 합치기 - zip

date = ['09/05', '09/06', '09/07', '09/08', '09/09']
close_price = [10500, 10300, 10100, 10800, 11000]

close_table = dict(zip(date, close_price)) # zip문 예시

print(close_table)
#{'09/05': 10500, '09/06': 10300, '09/07': 10100, '09/08': 10800, '09/09': 11000} 출력된다.

 

집합

 

s1 = set([1, 2, 3])

print(s1) # 간단한 예시, <class 'set'>

 

문자열사용시,

s1 = set("hello")

print(s1) #집합개념에 순서가 없으므로 {'o', 'h', 'e', 'l'}가 출력된다.

 

그런데 위에서 살펴본 set("Hello")의 결과가 좀 이상한데, 분명 "Hello" 문자열로 set 자료형을 만들었는데 생성된 자료형에는 l 문자가 하나 빠져 있고 순서도 뒤죽박죽이다. 그 이유는 set에 다음과 같은 2가지 특징이 있기 때문이다.

  • 중복을 허용하지 않는다.
  • 순서가 없다(Unordered).

집합자료는 인덱싱이 불가능하기때문에 list나 tuple로 변환시켜서 인덱싱을 해줘야한다.

 

s1 = set([1, 2, 3, 4])
l1 = list(s1)

print(l1[0]) # 리스트 0번은 1이기때문에, 1이 출력된다.

 

집합을 쓰는 이유는 중복제거할때 많이 쓰인다.

 

교집합 (함수 intersection)

s1 = set([1, 2, 3, 4, 5, 6])
s2 = set([4, 5, 6, 7, 8, 9])

print(s1 & s2) # 두개를 교집합하면 {4, 5, 6}이 출력된다.

 

합집합 (함수 union)

s1 = set([1, 2, 3, 4, 5, 6])
s2 = set([4, 5, 6, 7, 8, 9])

print(s1 | s2) # 두개를 합집합하면 {1, 2, 3, 4, 5, 6, 7, 8, 9}이 출력된다.

 

차집합 (함수 difference)

s1 = set([1, 2, 3, 4, 5, 6])
s2 = set([4, 5, 6, 7, 8, 9])

print(s1 - s2) # 두개를 차집합하면 {1, 2, 3}이 출력된다.

 

집합 자료형 관련 함수

값 1개 추가하기 - add

s1 = set([1, 2, 3, 4, 5, 6])
s1.add(7)

print(s1) # 7을 add해주면 {1, 2, 3, 4, 5, 6, 7}가 출력된다.

 

값 여러 개 추가하기 - update

s1 = set([1, 2, 3, 4, 5, 6])
s1.update([7, 8, 9])

print(s1) # 7, 8, 9를 update 해주면 {1, 2, 3, 4, 5, 6, 7, 8, 9}가 출력된다
# 또한 중복값일경우 중복제거가 되므로 유의해준다.

 

특정 값 제거하기 - remove

s1 = set([1, 2, 3, 4, 5, 6])
s1.remove(2)

print(s1) # 특정값인 2를 제거하여 {1, 3, 4, 5, 6} 출력된다.

 

불(bull)

불(bool) 자료형이란 참(True)과 거짓(False)을 나타내는 자료형이다. 불 자료형은 다음 2가지 값만을 가질 수 있다.

  • True: 참을 의미한다.
  • False: 거짓을 의미한다.

자료형의 참과 거짓

‘자료형에 참과 거짓이 있다?’라는 말이 조금 이상하게 들리겠지만, 참과 거짓은 분명히 있다. 이는 매우 중요한 특징이며 실제로도 자주 쓰인다.

 

변수

변수에는 각각 id가 있고 그 안에 값이 들어가져있다.

 
a = [1, 2, 3]
b = a

print(id(a)) # 주소 1800895047104
print(id(b)) # 주소 1800895047104 두 주소의 값이 같게 나온다.

print(a is b) # True가 출력된다.

 

이용하기

[:]

a = [1, 2, 3]
b = a[:] # a를 슬라이싱해서 b에 넣어주기때문에 두 값의 주소는 다르게 된다.
a[1] = 4

print(id(a)) # 주소 1800895047104
print(id(b)) # 주소 2725758791616 두 주소의 값이 다르게 나온다.
print(a is b) # False가 출력된다.

 

list

a = [1, 2, 3]
b = a[1] # a를 뽑고 거기에 인덱스 1번째를 불러오기때문에 주소값이 달라진다.
a[1] = 4

print(id(a)) # 주소 1800895047104
print(id(b)) # 주소 2725758791616 두 주소의 값이 다르게 나온다.
print(a is b) # False가 출력된다.

 

이외에도 copy 모듈이 있는데, 추후에 from, import 개념을 배워서 써보도록 해봐야겠다.

 

변수를 만드는 여러가지 방법

# a = 'python'
# b = 'title'
a, b = ('python', 'title') #이 방법으로도 변수에 값을 넣어줄 수 있다
print(a) # python 출력
print(b) # title 출력
[a, b] = ['python', 'title'] # list로도 변수에 값을 넣어줄 수 있다
print(a) # python 출력
print(b) # title 출력

 

변수 바꾸는 방법

a = 3
b = 5
a,b = b,a # 변수끼리 변경이 가능한데,

print(a) # 5가 출력되고
print(b) # 3이 출력된다.

 

이것을 끝으로 점프투파이썬의 자료형에 대해 공부했다.

거의 이틀동안 한문제 한문제 직접 써보며 터득했는데, 확실히 직접 해보고 부딪혀보는게 이해가 더 빨리되는느낌이다.

 

내일부턴 제어문과 함수에 대해 좀 빡세게 공부해봐야겠다. 

 

다행히 한번도 안졸렸다!!!

'기록보드 > TIL' 카테고리의 다른 글

TIL 23 (파이썬 함수)  (0) 2024.02.23
TIL 22 (파이썬 제어문)  (1) 2024.02.22
TIL 20 (파이썬 시작 2)  (1) 2024.02.20
TIL 19 (파이썬 시작)  (1) 2024.02.19
TIL 18 (분야찾기)  (0) 2024.02.18