본문 바로가기
ML&DATA/python for data analysis

파이썬 - (내장 자료구조, 리스트 표기법)

by sun__ 2020. 7. 18.

 

**튜플

모든 순차 자료형이나 이터레이터는 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]]