donut

'orderedDict'에 해당되는 글 1건

  1. 파이썬 Collections

파이썬 Collections

Function

 

 

 

collections

콜랙션이란?
리스트, 튜플, 사전형 형식에 대한 확장 모듈이다.

앞서말한 3가지 형식에 대해 편의성, 실행, 효율을제공한다.

종류로는 아래 5가지가 있다.

from collections import deque
from collections import Counter
from collections import OrderedDict
from collections import defaultdict
from collections import namedtuple
 

deque

Stack 과 Queue를 지원하는 모듈로 기억하자. 정보처리기사에서 공부한 스텍과 큐다.
list에 비해 효율적인 자료 저장 방식을 지원한다고 한다.

deque_예시

In [18]:
from collections import deque
In [75]:
#deque 선언하여, 0~9까지의 수를 저장해줌
deque_list = deque()
for i in range(10):
    deque_list.append(i)
print(deque_list)#일반적인 리스트 [] 와는 다른 deque([])로 생성됨
print(type(deque_list))#type은 collections.deque로 확인
 
deque([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
<class 'collections.deque'>
In [76]:
deque_list.appendleft(777)#appendleft로 왼쪽에 원하는 요소 삽입가능
print(deque_list)
 
deque([777, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
In [77]:
deque_list.append(999)#디폴트로 오른쪽에 들어감
print(deque_list)
 
deque([777, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 999])
In [78]:
deque_list.rotate(3)#값을 오른쪽으로 3칸 이동한다. 리스를 벗어나게 되는 오른쪽 3개의 값들은 왼쪽으로 온다.
print(deque_list)
 
deque([8, 9, 999, 777, 0, 1, 2, 3, 4, 5, 6, 7])
In [79]:
print(deque(reversed(deque_list)))#요소의 순서를 역으로 한다.
 
deque([7, 6, 5, 4, 3, 2, 1, 0, 777, 999, 9, 8])
In [80]:
deque_list.extend(['ㄱ',555,'A'])#요소에 값을 추가함 디폴트는 오른쪽
print(deque_list)
 
deque([8, 9, 999, 777, 0, 1, 2, 3, 4, 5, 6, 7, 'ㄱ', 555, 'A'])
In [81]:
deque_list.extendleft(['','donut',888])#왼쪽으로 추가 가능
print(deque_list)
 
deque([888, 'donut', '', 8, 9, 999, 777, 0, 1, 2, 3, 4, 5, 6, 7, 'ㄱ', 555, 'A'])
In [82]:
print(deque_list.pop())#제일 오른쪽 값을 삭제및 선택
print(deque_list)#맨 오른쪽 값이 삭제된 상태
 
A
deque([888, 'donut', '', 8, 9, 999, 777, 0, 1, 2, 3, 4, 5, 6, 7, 'ㄱ', 555])
 

deque 와 list속도비교

In [84]:
from collections import deque
import time

시작시간 = time.time()
deque_list = deque()

for i in range(10000):
    for i in range(10000):
        deque_list.append(i)
        deque_list.pop()
print(time.time() - 시작시간, "초")
 
11.865183115005493 초
In [85]:
from collections import deque
import time

시작시간 = time.time()
일반리스트 = []

for i in range(10000):
    for i in range(10000):
        일반리스트.append(i)
        일반리스트.pop()
print(time.time() - 시작시간, "초")
 
28.828917980194092 초
 

OrderedDict

일반 dict형과 달리 데이터의 순서를 조작하여 dict를 반환한다.

OrderedDict_예시

In [115]:
test1 = {}
test1['x'] = 1
test1['y'] = 2
test1['z'] = 3
test1['l'] = 9

for i,v in test1.items():
    print(i,v)
print(test1)
 
x 1
y 2
z 3
l 9
{'x': 1, 'y': 2, 'z': 3, 'l': 9}
In [116]:
from collections import OrderedDict

test2 = OrderedDict()
test2['x'] = 1
test2['y'] = 2
test2['z'] = 3
test2['a'] = 9

for i,v in test2.items():
    print(i,v)
print(test2)
 
x 1
y 2
z 3
a 9
OrderedDict([('x', 1), ('y', 2), ('z', 3), ('a', 9)])
In [113]:
#key값을 기준으로 정렬
for i,v in OrderedDict(sorted(test2.items(),key =lambda x: x[0])).items():
    print(i,v)
 
a 9
x 1
y 2
z 3
In [117]:
#value값을 기준으로 정렬
for i,v in OrderedDict(sorted(test2.items(),key =lambda x: x[1])).items():
    print(i,v)
 
x 1
y 2
z 3
a 9
 

defaultdict

Dict에 기본값을 지정하고, 신규값 생성시 활용한다.

In [172]:
from collections import defaultdict
d= defaultdict()
d = defaultdict(lambda: 2) #디폴트값 2 설정
print(d["first"])
 
2
In [173]:
text = "아침 점심 저녁으로 라면을 밥으로 먹자 아침에 일찍 일어나서 밥을 먹자 점심엔 밥을 안먹고 치킨을 먹자".split()
print(text)
 
['아침', '점심', '저녁으로', '라면을', '밥으로', '먹자', '아침에', '일찍', '일어나서', '밥을', '먹자', '점심엔', '밥을', '안먹고', '치킨을', '먹자']
In [175]:
from collections import OrderedDict
word_count = defaultdict(object)
#디폴트 값을 10으로 지정했기 때문에 모든 요소가 10부터 카운트가 된다.
word_count = defaultdict(lambda : 10)
for word in text:
    word_count[word] +=1
for i, v in OrderedDict(sorted(word_count.items(),key=lambda t: t[1],reverse =True)).items():
    print(i,v)
 
먹자 13
밥을 12
아침 11
점심 11
저녁으로 11
라면을 11
밥으로 11
아침에 11
일찍 11
일어나서 11
점심엔 11
안먹고 11
치킨을 11
 

Counter

숫자를 센다고 생각하면 이해하기 쉽다.
단어 단위로 수를샌다.

In [141]:
from collections import Counter

test1 = Counter()
test1 = Counter('배고프다')

print(test1)

test1 = Counter('Hellow')
print(test1)
 
Counter({'배': 1, '고': 1, '프': 1, '다': 1})
Counter({'l': 2, 'H': 1, 'e': 1, 'o': 1, 'w': 1})
In [176]:
#다음과 같이 dict선언을 통해 리스트를 생성하는것 또한 가능하다.
test2 = Counter({'aaa' : 5, 'bbb' : 2})
print(test2)
print(list(test2.elements()))
 
Counter({'aaa': 5, 'bbb': 2})
['aaa', 'aaa', 'aaa', 'aaa', 'aaa', 'bbb', 'bbb']
In [164]:
#연산기능도 제공한다.
#0과 음수는 표현하지 않는듯 하다.
test3 = Counter(a=4, b=20, c=3, d=101)
test4 = Counter(a=10, b=20, c=30, d=100)
print(test3 + test4)
print(test3 - test4)
print(test4 - test3)
print(test3 & test4)
print(test3 | test4)
 
Counter({'d': 201, 'b': 40, 'c': 33, 'a': 14})
Counter({'d': 1})
Counter({'c': 27, 'a': 6})
Counter({'d': 100, 'b': 20, 'a': 4, 'c': 3})
Counter({'d': 101, 'c': 30, 'b': 20, 'a': 10})
 

namedtuple

사실 이부분은 어렵다.. 아직 이해가 덜 되는 부분임으로 조금더 공부를 하고 익혀야겠다.

In [168]:
from collections import namedtuple
test = namedtuple('test', ['x','y'])
t = test(11,y=22)
print(t[0] + t[1])
 
33
In [171]:
x,y = t
print(x,y)
print(t.x + t.y)
print(test(x=11,y=22))
 
11 22
33
test(x=11, y=22)
 

부스트 코스 강의 내용을 참고하여 작성하였습니다.
나름 응용도 하였고, 각색 하여 여러 경우의 수를 생각해보았습니다.

사실 basic이라고 하기엔 다소 어려운 내용인데요,
어렵기 때문에 여러번 복습 해야겠습니다.

In [ ]:
 

'Function' 카테고리의 다른 글

파이썬 Enumerate & zip  (0) 2020.07.08
파이썬 스플릿 & 조인  (0) 2020.07.07
파이썬 함수 lambda(람다)  (1) 2020.07.06
리스트 컴프리헨션  (0) 2020.07.05