**튜플
모든 순차 자료형이나 이터레이터는 tuple 메서드를 통해 튜플로 변환할 수 있다.
tuple([4,0,2]) #out: (4,0,2)
tup = tuple('string') #out: ('s', 't', 'r', 'i', 'n', 'g')
튜블에 저장된 객체 자체는 변경이 가능하지만, 한 번 생성되면 각 슬롯에 저장된 객체를 변경할 수는 없다.
tup = tuple(['foo', [1,2], True])
tup[1].append(3) #out: ('foo', [1,2,3], True)
tup[2] = False #error!
+연산으론 concat를, *연산으론 복사본을 반복해서 늘일 수 있다.
(1,2) + (3) #out: (1,2,3)
(1,2)*2 #out: (1,2,1,2)
튜플의 처음 몇몇 값만 필요할 때 특수 문법. * 아스테리스크 사용. 나머지는 배열로 반환됨.
values = 1,2,3,4,5
a,b,*_ = values
a,b #out:(1,2)
_ #out:[3,4,5]
**리스트
append, insert, pop, remove, in예약어, sort
+연산은 concat (+보단 extend메서드가 더 빠르다)
bisect 모듈은 이진탐색과 정렬된 리스트에 값을 추가하는 기능을 제공한다.
bisect.bisect(list, x) : x가 list에 추가될 수 있는 위치 반환.
bisect.insort(list, x) : list에 x를 추가. 정렬된 상태 유지
import bisect
a = [1,1,2,3]
bisect.bisect(a,2) #out: 3
bisect.insort(a,2)
a #out:[1,1,2,2,3]
**enumerate
(i,value) 튜플을 반환하는 함수이다. 딕셔너리와 같이 쓰는 경우가 많다.
for i,value in enumerate(collection):
mp[value] = i
**sorted
정렬된 새로운 순차 자료형을 반환함.
sorted([3,1,2]) #out: [1,2,3]
sorted('cab') #out: ['a','b','c']
**zip
여러 순차 자료형을 서로 짝지어서 zip 타입의 튜플리스트를 생성함. list로 형변환 가능. 파라미터 중 가장 짧은 것의 길이에 맞춰짐.
seq1 = ['a', 'b', 'c']
seq2 = ['d', 'e']
zipped = zip(seq1, seq2)
list(zipped) #out: [('a','d'), ('b','e')]
다시 풀어줄 수도 있음.
seq1, seq2 = zip(*zipped)
seq1 #out: ('a','b')
seq2 #out: ('d','e')
**reversed
순차자료형을 역순으로 순회함. reversed는 제너레이터이고 iterator가 반환되므로 list()나 for로 값을 모두 받아줘야 한다.
list(reversed(range(3)))
#out: [2,1,0]
**딕셔너리(사전)
해시맵, 연관배열.
in 예약어로 어떤 키가 사전에 존재하는 지 알 수 있다.
단순히 dic[a]=b 로 새로운 원소를 추가할 수 있다.
del 예약어나 pop 메서드(값을 반환하고 해당 키 삭제)로 원소 삭제할 수 있다.
update로 다른 사전과 합할 수 있다.
keys, values메서드로 키, 값 이터레이터를 얻을 수 있다.
empty_dict = {} #사전을 생성하는 방법
d1 = {'a' : "happy", 5 : [1,2,3]}
'a' in d1 #d1 사전에 'a'존재하면 True
#out: True
d1['dummy'] = 1
d1 #out: {'a' : "happy", 5 : [1,2,3], 'dummy' : 1}
del d1[5]
d1 #out: {'a' : "happy", 'dummy' : 1}
ret = d1.pop('dummy')
ret #out: 1
d1 #out: {'a' : "happy"}
#update메서드로 다른 사전과 합할 수 있다. 이미 존재하는 키도 갱신해버림
d1.update({'a' : 'puppy', 'b' : 'foo', 'c' : 0})
d1 #out: {'a' : 'puppy', 'b' : 'foo', 'c' : 0}
#keys와 values 메서드로 이터레이터를 반환. 키-값쌍은 같은 순서로 이뤄짐
list(d1.keys()) #out:['a', 'b', 'c']
list(d1.values()) #out:['puppy', 'foo', 0]
zip으로 두 리스트를 인자로 받아 사전을 생성 가능
mapping = {}
for key,value in zip(list1, list2):
mapping[key] = value
key값이 사전에 있는 지 모를 때는 if-else문을 사용해야 할 것.
값을 읽을 땐 get메서드로, 값을 쓸 땐 setdefault메서드로 단순화 가능
value = mapping.get(key, default_val)
#words리스트에서 각 단어의 첫 글자를 key로하는 사전을 만들고자 함.
words = ['apple', 'bat', 'bar', 'atom', 'book']
by_letter = {}
for word in words:
letter = word[0]
by_letter.setdefault(letter, []).append(word)
by_letter
#out: {'a': ['apple', 'atom'], 'b': ['bat', 'bar', 'book']}
key값으론 스칼라형이나 튜플처럼 값이 바뀌지 않는 객체만 사용 가능하다. (해시가능해야 함)
hash('string') #out: -3766517062692951790
hash([1,2,3]) #error!
hash(tuple([1,2,3])) #out: 2528502973977326415
**집합(set)
사전구조에서 key만 있는 형태.
add,clear,remove,pop,union,update,intersection, difference, isupset(확대집합인지), issubset(부분집합인지) 등 메서드
사전처럼 값으로 해시가능한 객체만 가질 수 있다.
a = {1,2,3}
b = {3,4,5}
a.union(b) #a|b와 같다
#out: {1,2,3,4,5}
a.intersection(b) #a&b와 같다
#out: {3}
**리스트 표기법(list comprehension)
집합, 사전구조에서도 사용 가능.
형태 :
[expr for val in collection if condition] .. 조건절은 생략 가능
{key_expr : value_expr for key,value in collection if condition}
ex) 문자열 리스트에서 길이가 3이상인 문자열을 대문자로 바꾼 원소들로 리스트를 구성
strings = ['a', 'as', 'bat', 'car', 'dove']
[x.upper() for x in strings if len(x) > 2]
#out: ['BAT', 'CAR', 'DOVE']
ex) 위 strings 배열에서 문자열의 위치를 담고 있는 사전을 생성. {value : index}꼴
mp = {val : i for i, val in enumerate(strings)}
#out: {'a': 0, 'as': 1, 'bat': 2, 'car': 3, 'dove': 4}
중첩된 리스트 표기법. 3차 이상은 잘 쓰지 않는다.
ex) tuple 배열에서 하나하나의 원소들의 배열로 바꾸는 예
some_tuples = [(1, 2, 3), (4, 5, 6), (7, 8, 9)]
flattend = [x for tup in some_tuples for x in tup]
flattend
#out: [1,2,3,4,5,6,7,8,9]
[[x for x in tup] for tup in some_tuples]
#out: [[1,2,3],[4,5,6],[7,8,9]]
'ML&DATA > python for data analysis' 카테고리의 다른 글
pandas - (Series, DataFrame, Index) (0) | 2020.07.19 |
---|---|
numpy 기본 : 배열과 벡터 연산 (0) | 2020.07.19 |
파이썬 - (함수, 예외처리, 파일, os) (0) | 2020.07.18 |
파이썬 - (시멘틱, 바인딩, 타입 등) (0) | 2020.07.18 |
파이썬 메모 (0) | 2020.07.18 |