레이블이 dictionary인 게시물을 표시합니다. 모든 게시물 표시
레이블이 dictionary인 게시물을 표시합니다. 모든 게시물 표시

2021년 10월 10일 일요일

python (dictionary) 자료구조 기본-딕셔너리(정렬)


dictionary(딕셔너리)

파이썬에 내장된 굉장히 쓸모있는 그리고 자주 사용하게 되는 자료 구조인 딕셔너리 입니다. 다른 언어의 map과 동일하거나 그 이상의 기능을 가집니다. 

map의 구조에 대해서 잘 모르시는 분은 '키',해당되는'값'을 매핑하는 연관 자료 구조라고 이해하면 됩니다.

키는 문자열과 숫자 그리고 문자열과 숫자로만 구성된 튜플이 될 수 있습니다.

당연한 얘기지만 한 딕셔너리 안에서 키가 중복되지 않습니다. 키:값 쌍 목록이 딕셔너리 표현법입니다.

삭제는 del을 이용합니다. 딕셔러리에 list(d) 를 수행하면 딕셔너리에서 사용되고 있는 모든 키의 리스트를 삽입 순서대로 돌려줍니다.


딕션너리 정의

dict() 함수를 이용해 만들 수 있습니다.

>>> a=dict()
>>> a
{}
>>> a=dict({'hello':100,'lion':200})
>>> a
{'hello': 100, 'lion': 200}
>>> a=dict(hello=100,lion=200)
>>> a
{'hello': 100, 'lion': 200}

대괄호를 이용해서 만들 수 있습니다.

>>> a={}
>>> a
{}
>>> a={'hello': 100, 'lion': 200}
>>> a


접근 참조 인덱싱

>>> a={1:100,0:200,"1":300}
>>> a
{1: 100, 0: 200, '1': 300}
>>> a[1]
100
>>> a["1"]
300
>>> a[0]
200
>>> a["1"]=400
>>> a
{1: 100, 0: 200, '1': 400}


삭제

삭제는 [키]로 이루어진다.

>>> a
{1: 100, 0: 200, '1': 400}
>>> del a[0]
>>> a
{1: 100, '1': 400}


반복/루프

딕셔너리의 list의 목록은 key가 돌아온다. 키를 이용해 디셔너리에 접근하여 처리가 가능하다.

>>> a
{1: 100, '1': 400}
>>> list(a)
[1, '1']
>>> for x in a:
...     print(x,a[x])
...
1 100
1 400


키정렬

키를 정렬 할것인가 값을 정렬할것인가에 따라 나뉘어집니다.

간단하게 키를 정렬하는 예제입니다. sorted 함수를 이용하면 키의 sort된 결과가 list형태로 돌아옵니다. 이것을 for loop를 사용해서 출력하면 됩니다. reverse정렬은 reverse=True 를 하면 됩니다.

if __name__ == "__main__":
	dict_test = {'ccc':300,'aaa':100,'bbb':200, 'ddd':150}
	
	print("\n key sort")
	rdata = sorted(dict_test)
	print(rdata)
	for x in rdata:
		print(x,dict_test[x])
		
	print("\n key sort reverse")
	rdata = sorted(dict_test,reverse=True)
	print(rdata)
	for x in rdata:
		print(x,dict_test[x])

결과

 key sort
['aaa', 'bbb', 'ccc', 'ddd']
aaa 100
bbb 200
ccc 300
ddd 150

 key sort reverse
['ddd', 'ccc', 'bbb', 'aaa']
ddd 150
ccc 300
bbb 200
aaa 100


값정렬

딕션너리의 items()라는 함수를 사용합니다. 그러면 tuple list형태로 변환이 되게 되는데 이것을 sorted 함수로 정렬합니다. 이것을 코드로 구현하면 아래와 같습니다.

f1(x) 함수는 정렬할때 정력할 키의 위치를 알려줄때 사용합니다. 딕셔너리의 키와는 다른 개념입니다.

def f1(x):
	return x[1]

if __name__ == "__main__":
	dict_test = {'ccc':300,'aaa':100,'bbb':200, 'ddd':150}

	print("\n value sort")
	rdata = sorted(dict_test.items(),key=f1)
	print(rdata)
	for x,y in rdata:
		print(x,y)
		
	print("\n value sort reverse")
	rdata = sorted(dict_test.items(),key=f1,reverse=True)
	print(rdata)
	for x,y in rdata:
		print(x,y)

결과

 value sort
[('aaa', 100), ('ddd', 150), ('bbb', 200), ('ccc', 300)]
aaa 100
ddd 150
bbb 200
ccc 300

 value sort reverse
[('ccc', 300), ('bbb', 200), ('ddd', 150), ('aaa', 100)]
ccc 300
bbb 200
ddd 150
aaa 100


키정렬2

위 개념을 이해했다면 다른방식으로도 키 정렬이 가능합니다. sorted 함수에 key에 x[0]가 되도록 설정하면 됩니다.

def f0(x):
	return x[0]

if __name__ == "__main__":
	dict_test = {'ccc':300,'aaa':100,'bbb':200, 'ddd':150}
	
	print("\n key sort")
	rdata = sorted(dict_test.items(),key=f0)
	print(rdata)
	for x,y in rdata:
		print(x,y)


리스트값의 정렬

좀 더 복잡한 형태입니다. 디셔너리가 리스트 형태를 취하고 있고 그중 특정 item의 정렬이 필요한 경우 입니다. f1() 함수의 변형이 필요합니다. 아래 예제에서는 list의 세번째 인자 값을 기준으로 정렬하는 예제입니다.

def f2(x):
	return x[1][2]

if __name__ == "__main__":

	dict_test = {'ccc':[100,300,140],'aaa':[200,400,300],'bbb':[100,40,300], 'ddd':[100,20,30]}
	print("\n list value sort")
	rdata = sorted(dict_test.items(),key=f2)
	print(rdata)
	for x,y in rdata:
		print(x,y)
	

여기에서 f2 함수의 x[1][2]의 의미입니다. 'ccc':[100,300,140]이란 첫번째 값의 경우 items로 변환이 되면 [('ccc',[100,300,140]),...] 이련 헝태도 변환되며 즉 x[1][2]의 경우 3번째 140의 값을 가지게 됩니다.

	x[1][2]
	-------
	x[0]:'ccc'
	x[1]:[100,300,140] 
	x[1][0]:100
	x[1][1]:300
	x[1][2]:140

결과

 list value sort
[('ddd', [100, 20, 30]), ('ccc', [100, 300, 140]), ('aaa', [200, 400, 300]), ('bbb', [100, 40, 300])]
ddd [100, 20, 30]
ccc [100, 300, 140]
aaa [200, 400, 300]
bbb [100, 40, 300]