[230209 - TIL] Python set() method를 이용한 리소스 목록 비교

Dongwoo Kim·2023년 2월 9일
0

TIL / WIL

목록 보기
79/113

1. 개요

어제 리소스의 목록을 비교하기위해 dictionaries compare를 이용하려고 했는데 요구사항에 맞게 추가, 삭제를 위한 로직을 설계하다보니 업데이트할 개체가 무엇인지 직접적인 비교 전에 먼저 알고 있으면 편할 것이라고 생각이 들었다. 따라서 기존 리소스 목록과 최신 리소스 목록을 비교해서 추가해야할 리소스가 뭐고 삭제해야할 리소스가 뭔지 또 겹치는 리소스는 업데이트를 해야할지 말아야할지 알 수 있도록 했다.


2. 예상 시나리오

DB DATA

기존 할일 목록 데이터를 가지고 있다고 가정 (id=71~74)

RESPONSE_DATA = [
    {
        "id": 71,
        "due_date_": "2022-12-28 12:12:12",
        "created_at": "2023-02-07 10:15:14",
        "updated_at": "2023-02-07 10:15:14",
        "title": "viewset TEST 1",
        "content": "viewset TEST 1",
        "status": "DONE",
        "rating": 0,
        "user": 4,
        "category": []
    },
    {
        "id": 72,
        "due_date_": "2022-12-28 12:12:12",
        "created_at": "2023-02-07 10:15:26",
        "updated_at": "2023-02-07 10:15:26",
        "title": "viewset TEST 2",
        "content": "viewset TEST 2",
        "status": "DONE",
        "rating": 0,
        "user": 4,
        "category": []
    },
    {
        "id": 73,
        "due_date_": "2022-12-28 12:12:12",
        "created_at": "2023-02-08 18:44:32",
        "updated_at": "2023-02-08 18:44:32",
        "title": "F TEST 3",
        "content": "F TEST 3",
        "status": "DONE",
        "rating": 0,
        "user": 4,
        "category": []
    },
    {
        "id": 74,
        "due_date_": "2022-12-28 12:12:12",
        "created_at": "2023-02-08 18:44:40",
        "updated_at": "2023-02-08 18:44:40",
        "title": "F TEST 4",
        "content": "F TEST 4",
        "status": "DONE",
        "rating": 0,
        "user": 4,
        "category": []
    }
]

RESPONSE_DATA

외부 API를 통해 최신 할일 목록을 조회했다고 가정 (id=72~75)

RESPONSE_DATA_2 = [
    {
        "id": 72,
        "due_date_": "2022-12-28 12:12:12",
        "created_at": "2023-02-07 10:15:26",
        "updated_at": "2023-02-07 10:15:26",
        "title": "viewset TEST 2",
        "content": "viewset TEST 2",
        "status": "DONE",
        "rating": 0,
        "user": 4,
        "category": []
    },
    {
        "id": 73,
        "due_date_": "2022-12-28 12:12:12",
        "created_at": "2023-02-08 18:44:32",
        "updated_at": "2023-02-08 18:44:32",
        "title": "F TEST 3",
        "content": "F TEST 3",
        "status": "DONE",
        "rating": 0,
        "user": 4,
        "category": []
    },
    {
        "id": 74,
        "due_date_": "2022-12-28 12:12:12",
        "created_at": "2023-02-08 18:44:40",
        "updated_at": "2023-02-08 18:44:40",
        "title": "F TEST 4",
        "content": "F TEST 4",
        "status": "DONE",
        "rating": 10,
        "user": 4,
        "category": []
    },
    {
        "id": 75,
        "due_date_": "2022-12-28 12:12:12",
        "created_at": "2023-02-08 18:55:54",
        "updated_at": "2023-02-08 18:55:54",
        "title": "DictionartiesCompare",
        "content": "viewset TEST 1",
        "status": "DONE",
        "rating": 0,
        "user": 4,
        "category": []
    },
]

시나리오

id=71 할일은 삭제되고 id=75 할일이 추가되었다. 또한 id=74 할일의 내용이 수정되었다. 이를 set()을 통해 간단하게 알아내보자


3. Code

db_data = RESPONSE_DATA
response_data = RESPONSE_DATA_2

db_set = set([data.id for data in db_data])         
response_set = set([data.id for data in response_data])

deleted_data_list = list(db_set - response_set)  # 삭제해야할 데이터
added_data_list = list(response_set - db_set)    # 추가해야할 데이터
update_data_list = list(response_set & db_set)   # 업데이트해야할 데이터

for updated_data in update_data_list:
	...
	# dictionaries compare를 이용해 업데이트해야하는지 확인 이후 작업 진행

4. set() 특징 & 고려사항

  • set()은 특정 리스트를 집합으로 만들면서 중복을 제거할 수 있다.
  • 위 예제처럼 차집합, 교집합, 합집합, 대칭교집합 등 집합연산을 수행할 수 있다.
  • 다만 list(), set(), 집합연산의 시간복잡도는 O(N)으로 목록의 길이가 길면 고려해봐야할 것이다.

5. 참고

profile
kimphysicsman

0개의 댓글