191112 [Python] Data Type & Structure 2 (시퀀스타입과 매핑타입)
Python Data Type & Data Structure
3. 시퀀스 타입 (list, tuple)
List
R의list 처럼 key와 value를 가지는 것은 아니다.
파이선의 가장 대표적인 자료구조로, 임의의 객체를 순차적으로 저장하는 자료구조
순서로 저장하므로 index를 활용할 수 있다.
기호는[ ] (대괄호)를 이용한다.
특징
1차원적 선형구조이나, R의 벡터와 다른 점은 list안에 서로 다른 데이터타입을 넣을 수 있다는 것
중첩이 가능하다
1) List 생성방법
# list 생성방법
myList = list() # 비어있는 list를 생성
myList = [] # list를 literal로 표현
myList = [1,2,3] # 3개의 값을 가지는 list 생성
myList = [1,3.14,True, "헬로"] # 모든 데이터타입을 저장
MyList = 10, ["Show","me", "the","money"], 3.14,True] #list안에 또 다른 자료구조를 넣을 수 있다
2) List안의 값을 Indexing으로 출력하기
- Indexing 결과의 데이터 구조는 추출하는 자료의 형태에 달려있음
MyList = 10, ["Show","me", "the","money"], 3.14,True]
# 3.14 뽑기
print(MyList[2])
# money 뽑기
print(MyList[1][3])
# True 뽑기
print(MyList[-1])
3) List안의 값을 Slicing으로 출력하기
- Slicing의 결과는 항상 Slicing전의 자료구조와 동일하게 출력됨
- List -> List
- Tuple -> Tuple
############Slicing으로 ###########
MyList = 10, ["Show","me", "the","money"], 3.14,True]
# 10 출력
print(MyList[0:1])
# the, money를 가져오기
print(MyList[1][2:])
4) List의 연산
R은 vectorwise연산을 함, 즉 각 위치끼리 더한다
그러나 Python의 list는 마치 R의 c처럼 두 리스트를 concatanate(연결)한다.
- list의 + 과 *
a=[1,2,3]
b=[4,5,6]
print(a+b) #[1, 2, 3, 4, 5, 6]
print(a*3) #[1, 2, 3, 1, 2, 3, 1, 2, 3]
- slicing 한 부분을 다른 list로 대체하기
- slicing과 indexing을 쓸 때 차이
# Slicing한 부분을 다른 list로 대체
a=[1,2,3]
# a[0] = 5 # 5,2,3
a[0:1] = [7,8,9] # [[7,8,9],2,3]
print(a)
a[1:] = [] # 2,3을 없애고 싶을 때. # a = [1]
a[0:1] = [7,8,9] # [7,8,9,2,3]
a[0] = [7,8,9] # [[7,8,9],2,3]
- list의 값 지우기
del a[1] # 2를 지우고싶을 때 # [1,3]
# 위험도가 높아 잘 사용하진 않음
5) List 함수인 append/ extend ( List에 값 추가, 확장 하기)
a = [1,2,3]
a.append("Hello")
a.append([4,5,6]) # list에 맨 마지막 한 칸을 생성
# 그 안에 데이터를 저장함
a.extend([4,5,6]) # list를 확장시키기
# + 와 동일
print(a)
6) List 정렬
a = [7,3,9,4,6,1,8]
result = a.sort() # a는 불변, result는 정렬
# 함수를 사용하면 원본은 변화X 것이 일반적이나
# list의 함수를 사용하면 원본이 변경됨
print(result) # none
print(a) # 1,3,4,5,7,8,9
a.sort() # 따라서 위의 수식을 쓸 필요 없이 이렇게만 사용
a.sort() # list가 가지고 있는 함수. 원본이 변경
sorted(a) # python이 제공하는 함수. 원본변경 X
result = sorted(a) # 따라서 결과를 return하도록 사용
print(a)
print(result)
# 이처럼 리스트의 함수들은 대체로 list자체를 제어함
a = ["Hello","kaka","World","haha"]
a.sort() # 정렬의 기본(오름차순)
# 문자일경우 (ASCII코드 오름차순)
print(a) # Hello, World, haha, kaka
a = ["홍길동","최길동","아이유","김연아", "신사임당"]
a.sort() #오름순 정렬
print(a)
a.sort(reverse=True)
print(a)
a.reverse() # 뒤에서부터 나열
print(a)
7) insert() : list에 특정 값 삽입
#insert() : 특정위치에 값을 밀어넣기
a = [1,2,3,4,5]
a.insert(1,"Hello")
print(a) # 1, Hello, 3,4,5
8) index(): List 내 자료를 찾기(index 위치를 반환)
a = [1,2,3,4,5]
print(a.index(2)) # 1
# print(a.index(6)) # error 6 is not valid
9) remove() : 첫번째 발견 요소 삭제
a = [1,2,3,4,5,1,2,3,4,5]
a.remove(3)
print(a) # 1,2,4,5,1,2,3,4,5
10) 지정한 자료만 뽑아내기
# 맨 마지막 요소 뜯어내기
a = [1,2,3,4,5]
print(a.pop()) # 5
print(a) # 1,2,3,4
# 지정한 위치의 요소 뜯기
print(a.pop(2)) # 3
print(a) # 1,2,4,5
11) list내 요소의 개수 세기
a = [1,2,3,4,5,1,2,1,3,4]
print(a.count(1)) # 3 #찾는 요소가 list안에 몇개
Tuple
1) List와 거의 동일, but Tuple은 소괄호로 표현 ()
a = () # empty tuple
print(type(a)) # tuple
2) 요소가 1개인 tuple 생성에 유의
myTuple = (1,) # 요소가 1개인 tuple
print(type(myTuple)) # tuple
myList = [1] # 요소1개인 list 생성
print(type(myList))
myTuple = (1) # 요소가 1개인 tuple 생성? -> no!
print(type(myTuple)) # intiger
#()를 tuple이 아닌 연산의 우선순위 ()로 인식함
3) indexing과 slicing 가능
myTuple = (1,2,3)
print(myTuple[0]) # 1
print(myTuple[0:2]) # (1,2) # 결과도 tuple
print(type(myTuple[0:2])) # <class 'tuple'> # 결과도 tuple!
4) read only (값을 바꿀 수 없다) -> 견고한 프로그래밍에 활용
myTuple[0] = 100 # 오류
#'tuple' object does not support item assignment
5) 항상 괄호를 생략할 수 있음
myTuple = 1,2,3 # tuple을 생성
print(myTuple) # (1, 2, 3)
a,b,c = 10,20,30
print(a) # 10
(a,b,c) = (10,20,30)
print(b) # 20
Tuple은 read only이므로 변경을 위한 함수가 X
Range
1. 특징 및 문법
숫자 영역을 잡는 형태로,
일반적으로 for 구문을 사용할 때 많이 사용한다.
range(start-inclusive, end-exclusive, by) ※ 끝이 exclusive임에 유의
range1 = range(10)
print(range1) #range(0, 10)
range2 = range(1,11,2)
print(range2) # range(1, 11, 2)
print 결과가 range로 나타남. 단 [1,3,5,7,9,10]로 인식하면 됨
2. 함께 쓰면 좋은 map() 함수
sent = "This is a sample Program. missisippi river"
alph = ''
compare = 0
for k in map(chr, range(97, 123)):
freq = sent.lower().count(k)
if compare < freq:
compare = freq
alph = k
print("{}가 {}개로 가장 많습니다".format(alph,compare))
4. Mapping Type
Dict (dictionary)
1) Dict의 기본 특징
- key와 value의 쌍으로 표현되는 자료구조
- JASON의 형태({name : "홍길동", age : 30 })와 완전히 동일
a = {"name":"홍길동", "age":30 }
print(type(a)) #{'name': '홍길동', 'age': 30, 10: 'hohoho'}
- key는
- 고유하며, 불변의 값을 사용해야 함
- tuple은 key로 사용 가능하나 list는 key로 사용 불가
# key의 고유성
a = {"name":"홍길동", "age" : 30, "age" :40}
print(a["age"]) # Error가 나지 않음
# 그러나 사용하면 안되는 코드!
# key는 고유해야 하므로
# tuple의 사용
a = {"name":"홍길동", ("address",) : "서울"} # tuple을 key로 사용
print(a)
print(a[("address",)]) # 서울을 뽑아내기
2) dict 자료에 key와 value 추가하기
만약 a라는 dict형 자료가 있다면, 다음과 같이 입력한다
: a[key명] = "value값"
a = {"name":"홍길동", "age":30 }
a[10] = "hohoho"
print(a) #{'name': '홍길동',..., 10: 'hohoho'}
a["hobby"] = "Game"
print(a) # {'name':... 'hobby': 'Game'}
3) dict 기본 함수
(1) keys(): 키 값을 모두 가져오기
- dict에서 value를 가져오려면 기본적으로 key를 알아야 함
- keys()는 dict에서 key만 뽑아내는 함수
- 결과를 dict_keys자료로 가져옴
- dict_keys는 list는 아니나, list와 유사한 자료구조
- list() 함수를 사용해 list로 바로 전환이 가능함 (일반적으로 dict keys를 그대로 사용)
a = {"name":"홍길동", "age":20, "address": "서울"}
a.keys()
myKey = a.keys()
print(myKey) # dict_keys(['name', 'age', 'address'])
myList = list(myKey)
print(myList) # ['name', 'age', 'address']
# 일반적으로 dict_keys를 직접 사용하고 리스트로 변환하지 않음
key값을 추린 dict_keys 데이터 구조는 list라는 함수를 이용해 리스트로 바로 변경할 수 있다
(2) values(): 값 가져오기
- dict_values 형태로 가져온다
a = {"name":"홍길동", "age":20, "address": "서울"}
myValue = a.values()
print(myValue) #dict_values(['홍길동', 20, '서울'])
(3) items() : key와 value를 tuple로 묶어 출력하기
- key와 value를 tuple로 묶어준다
- 여러개의 tuple을 담은 dict_items 형태로 가져온다
myItem = a.items()
print(myItem) # dict_items([('name', '홍길동'), ('age', 20), ('address', '서울')])
4) 연습문제
for 문을 이용하여 dict 안에 있는 모든 key와 value를 출력하라
a = {"name":"홍길동", "age":20, "address": "서울"}
for k in a.keys():
print("{}-{}".format(k,a[k]))
# indent로 for문의 블럭을 잡는다(***)
# 결과 name-홍길동
# age-20
# address-서울
print("age" in a) # 특정 key값이 dict에 있는지 확인
[참고개념]
개채의 동일성과 내용동일성은 다르다
따라서 이르 활용한 list의 논리식 해석에 주의해야 한다.
a = [1,2,3]
b = [1,2,3]
print(id(a)) #a의 변수가 갖고 있는 값(데이터의 메모리 주소 해시값)
# 내용 동일성과 개체의 완전 동일성
print(a == b) # True
# a와 b의 내용이 같은지 물어봄
# (메모리에 저장된 내용)
print(a is b) # False
# a와 b가 동일한 것인지 비교
a = [1,2,3]
b = a
print(a == b) # True
print(a is b) # True
a = [1,2,3]
b = a[:] # b = [1,2,3]
print(a == b) # True
print(a is b) # False