본문 바로가기

Python

20210105_Python 입문3, 자료구조, list, tuple, dict, set

Python 입문 03


Python 자료구조 (list, tuple)

1. List (리스트)

  • [ ] 대괄호 사용

  • 그릇, 배열로 어떤 특징의 모음이라고 보면 된다.

  • 순서O, 중복O, 수정O, 삭제O


1) 선언

a = [1, 2, 3, ['a', 'b', 'c']]  # 리스트 내에 리스트 중복 가능 
b = list(1, 2, 3, 'h','i', 'j', 'k') # 명시적 사용도 가능

2) 인덱싱

print(a[2]) # 인덱싱 번호 2번 출력
print(a[3][1]) # 중복 리스트 인덱싱 번호 1번 출력
# 인덱싱 번호 음수도 가능

3) 슬라이싱

저번 시간에 엄청 어렵게 이해했는데 편하게 이해하는 법 만듦
ex) a[ x : y : z ]
[ X 인덱싱 넘버 값 에서 :
Y-1 인덱싱 번호 값 까지 반환 :
조건으로 X+nZ 인덱싱 넘버 값만 반환 (n = 0 , 1, 2, 3, ...) ]

음수에서도 동일

print(a[3][0:2]) # 중복 list에서 슬라이싱 가능

4) 연산

print(a + b)                    # 하나의 리스트로 만들어줌
print(a * 3)                    # 길이가 3배로 늘어남
print(str(a[0]) + 'hi')         # print(c[0] + 'hi') -> error -> str로 형 변환
print('{0}hi'.format(a[0]))     # 결과 : 1hi
print('{a}hi'.format(a = a[0])) # 결과 : 1hi
print('%dhi' % (a[0]))          # 결과 : 1hi
print('%shi' % (a[0]))          # 결과 : 1hi
print('%fhi' % (a[0]))          # 결과 : 1.000000hi

5) 리스트 수정, 삭제

  • 수정
a = [1, 2, 3, ['a', 'b', 'c']]
a[0] = 25
print(a) # 인덱스 넘버 0 자리에 25값 으로 대체,수정
a[1:2] = [7, 8, 9] # 슬라이싱을 통한 "리스트" 대체,삽입은 값 형태로 삽입 됨
a[1] = [10, 11, 12] # 인덱싱을 통한 "리스트" 대체,삽입은 리스트 형태로 삽입 됨
  • 삭제
    a = [1, 2, 3, ['a', 'b', 'c']]
    del a[1] # a의 인덱싱 넘버 1의 값 삭제
    a.remove(2) # 값 2를 찾아서 삭제
    a.pop() # 맨 마지막 값을 끄집어 내고 삭제
    a.pop(1) # 인덱스 넘버 1의 값을 끄집어 내고 삭제

6) 리스트 함수(method)

함수 쓰면서 조작하는데로 변수 내 리스트 값은 계속 반영되는 것임

a = [1, 2, 3, ['a', 'b', 'c']]
b = ['d', 'e', 'f']
c = [1, 2, 3]
a.append(4) # a 리스트 끝 부분에 값 추가
a.append(b) # 리스트 끝 부분에 b 변수의 리스트 자체를 추가
a.extend(b) # 리스트 끝 부분에 b 변수 리스트의 값을 추가
b.sort() # a리스트 내 값들 오름차순 정렬
# 단, 문자(str), int, list 등 데이터 타입이 다를 경우 불가
c.reverse() # a리스트 내 값들 내림차순 정렬
a.insert(2, 7) # 인덱스 넘버 2번에 7 추가 하고 뒤엣건 밀림 (수정 대체X)



2. Tuple (튜플)

  • ( ) 소괄호 사용
  • 순서 O, 중복O, 수정X, 삭제X -> insert, append 등 사용 불가
  • 프로그램에서 변하면 안되는 중요한 값들을 튜플로 지정

1) 선언

a = (1, 2, 3, 4) # 소괄호 사용
b = tuple(('a', 'b', 'c', 'd')) # 직접 명시
c = (1, 2, ('e', 'f', 'g')) # 중복 가능

2) 인덱싱 , 슬라이싱

a = (1, 2, 3, 4) 
b = ('a', 'b', 'c', 'd') 
c = (1, 2, ('e', 'f', 'g'))
print(c[2]) # 인덱싱은 [] 대괄호 사용
print(c[2][2]) # 중복 인덱싱 가능
print(c[2][0:2]) # 중복 슬라이싱 가능

3) 연산

a = (1, 2, 3, 4) 
b = ('a', 'b', 'c', 'd') 
print(a+b) # 튜플 값 합치기 가능
print(a * 3) # 길이 3배 (반복해서) 


4) 함수

a = (1, 2, 3, 4) 
print(a.index(3)) # 값3 의 인덱스 넘버 반환
print(a.count(2)) # 값2 의 개수 반환
print(3 in a) # 변수 a 에 3이 포함하는지 불린 반환
print(3 not in a) # 변수 a 에 3이 안 포함하는지 불린 반환



3. Dictionary (사전) , dict

  • { } 중괄호 사용
  • 순서 x, 중복x, 수정O, 삭제O
  • Xml, css, json, js, mongoDB 등의 형식이 비슷함
  • key 와 value 로 이루어 져있고 이렇게 한 쌍을 item 이라고 함

1) 선언

a = {'name': 'kim', 'phone': '010-1234-1234', 'birth': '960402'} # key 중복 X , value 값 중복 O 
b = {0: 'dog', 1: 'cat'} # 숫자 key 가능 한데 주로 문자로 함
C = {'arr': [1, 2, 3, 4]} # 값은 모든 데이터 타입이 가능

2) 출력, 수정

  • 출력
print(a['name']) # key 값이 없으면 error로 실행 안됨 
print(a.get('name')) # Key 값이 없어도 none 결과 출력. 안전하게 조회 가능

  • 수정, 추가
a['name'] = ['kang'] # 기존의 있는 키에 값을 변경
a['address'] = ['Seoul'] # 새로운 키 와 값을 추가
a['rank1'] = [1, 2, 3] # 새로운 키 와 값(리스트 타입) 추가
a['rnak2'] = (1, 2, 3) # 새로운 키 와 값(튜플 타입)을 추가

3) 인덱싱(key) , 슬라이싱

print(a['name']) # key 값을 가지고 출력하고 따로 인덱싱 번호는 없음
print(a['rank1'][1]) # 중복 인덱싱 가능 어차피 리스트가 들어 있기 때문에
print(a['rank2'][1]) # 중복 인덱싱 가능 튜플 값 
print(a['rank'][0:2]) # dict 안에 Key: list 슬라이싱 가능
print(a['rank2'][0:2]) # dict 안에 Key: tuple 슬라이싱 가능

4) 연산 X

print(a+b) # dict + dict 불가
print(a * 3) # dict 3배 불가 

5) 함수

print(a.keys()) # dict 타입으로 key 만 가져옴 그때 그때 순서는 다름
# a.keys()의 인덱싱은 불가
print(list(a.keys())) # list 타입으로 key만 가져옴
print(list(a.key())[0:2]) # list 형에서 인덱싱 가능
temp = list(a.keys()) # 또는 임시변수에 선언
print(temp[0:2]) # 인덱싱 가능
# dict 형태 인덱싱은 안되고 list, tuple 형태만 가능
print('name' in a)
print('name' not in a) # key는 in, not in 가능



4. 집합 set

  • set([]) 을 사용 ,set 직접 선언
  • 순서 x, 중복x, 수정O, 삭제O
  • 수치계산, 데이터 분석 등 (내부적, 오픈소스 등에 쓰임)

1) 선언, 출력

a = set()
b = set([1, 2, 3, 4])
c = set([1, 4, 5, 6, 6])
print(type(a))
print(c) # 중복 제거 됨 집합이기에 , 터미널에서는 중괄호로 결과 출력

2) 슬라이싱 (tuple, list로 형변환 필요)

t = tuple(b)
print(b)
# 또는
print(tuple(b))
print(list(b))
# 형 변환 작업
print(tuple(b)[0:2]) # 슬라이싱 가능
print(list(b)[0:2])

3) 함수

  • 교집합
s1 = set([1, 2, 3, 4, 5, 6])
s2 = set([4, 5, 6, 7, 8, 9])
print(s1.intersection(s2)) # 교집합 함수 intersection
print(s2.intersection(s1))
print(s2 & s1) # 교집합 기호 '&'

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

print(s1 | s2) # 합집합 기호 '|' vertical bar , 수직선
print(s1.union(s2)) # 합집합 함수 union 

  • 차집합
s1 = set([1, 2, 3, 4, 5, 6])
s2 = set([4, 5, 6, 7, 8, 9])
print(s2 - s1) # 차집합 기호 '-'
print(s2.difference(s1)) # 차집합 함수 difference 

  • 추가 제거
s3 = set([7, 8, 10, 15])
s3.add(18) # 집합에 뒷부분 추가 함수 ,  중복은 알아서 필터링 됨
print(s3)
s3.remove(15)
print(s3) # 주의 print(s3.remove(15)) 는 안됨

4) 연산 X

print(s1+s2) # set + set 불가
print(s1 * 3) # set 3배 불가 

---


20210105_NRC (X)

오늘은 런닝 건너 뛰었다. 내일 하자

데이터 타입 자료구조를 끝냈다.

아직까진 공부시간이 대략 7~8 시간 밖에 안되는 것 같다. 4시간 더 확보하도록 하자. 진도가 느리게 나가면 그만큼 열심히 더 하면 될 듯

물론 포스팅에 시간이 좀 걸려도 복습으로 생각하자.