본문 바로가기

Python

[Python] List 형태의 Dictionary 다루기

List를 다루는 것은 Python에서 필수라고 할 수 있다. 
그 중에서 List 형태 안에 Dictionary를 다룰 일이 자주 있는데, 이에 대해서 알아보자.

1. List 형태의 Dictionary 정렬

person = [
    {'name' : 'kimSG', 'age' : 10},
    {'name' : 'ParkSG', 'age' : 20},
    {'name' : 'KangSG', 'age' : 30},
    {'name' : 'ChoSG', 'age' : 40}
]

[방법 1] sorted() + lambda
 - sorted()와 lambda를 사용하여 name으로 오름차순 정렬 후 age로 오름차순 정렬하는 방법

data = sorted(person, key=lambda p: (p.get('name'), p.get('age')))

for i, d in enumerate(data):
	print(f"{i}번째, {d}")

# 0번째, {'name': 'ChoSG', 'age': 40}
# 1번째, {'name': 'KangSG', 'age': 30}
# 2번째, {'name': 'ParkSG', 'age': 20}
# 3번째, {'name': 'kimSG', 'age': 10}

[방법 2] sorted() + itemgetter 
 - sorted()와 itemgetter를 사용하여 name으로 오름차순 정렬 후 age로 오름차순 정렬하는 방법

from operator import itemgetter

data = sorted(person, key = itemgetter('name', 'age'))

for i, d in enumerate(data):
	print(f"{i}번째, {d}")

# 0번째, {'name': 'ChoSG', 'age': 40}
# 1번째, {'name': 'KangSG', 'age': 30}
# 2번째, {'name': 'ParkSG', 'age': 20}
# 3번째, {'name': 'kimSG', 'age': 10}

참고
https://inma.tistory.com/138

2. List 형태의 Dictionary 중복 제거

[방법 1] Dictionary 전체 중복 제거

import collections

person = [
    {'name' : 'kimSG', 'age' : 10},
    {'name' : 'ParkSG', 'age' : 20},
    {'name' : 'KangSG', 'age' : 30},
    {'name' : 'ChoSG', 'age' : 40},
    {'name' : 'ChoSG', 'age' : 50},
    {'name' : 'KangSG', 'age' : 30}
]

""" 순서가 보장되지 않는 중복 제거 """
dedupleList_1 = list(map(dict, set(tuple(sorted(p.items())) for p in person)))
print(f"순서가 보장되지 않는 중복제거 : {dedupleList_1}")
# 순서가 보장되지 않는 중복제거 : [{'age': 10, 'name': 'kimSG'}, {'age': 30, 'name': 'KangSG'}, {'age': 50, 'name': 'ChoSG'}, {'age': 40, 'name': 'ChoSG'}, {'age': 20, 'name': 'ParkSG'}]

""" 순서가 보장되는 중복 제거 """
dedupleList_2 = list(map(dict, collections.OrderedDict.fromkeys(tuple(sorted(p.items())) for p in person)))
print(f"순서가 보장되는 중복제거 : {dedupleList_2}")
# 순서가 보장되는 중복제거 : [{'age': 10, 'name': 'kimSG'}, {'age': 20, 'name': 'ParkSG'}, {'age': 30, 'name': 'KangSG'}, {'age': 40, 'name': 'ChoSG'}, {'age': 50, 'name': 'ChoSG'}]

[방법 2] Dictionary 특정 key 중복 제거

""" 특정 key에 대한 중복 제거 """
dedupleList_3 = list({v['name']:v for v in person}.values())
print(f"특정 key에 대한 중복 제거 : {dedupleList_3}")
# 특정 key에 대한 중복 제거 : [{'name': 'kimSG', 'age': 10}, {'name': 'ParkSG', 'age': 20}, {'name': 'KangSG', 'age': 30}, {'name': 'ChoSG', 'age': 50}]

 

참고
https://sanghaklee.tistory.com/60