Одним из решений является использование класса в качестве оболочки. Этот класс может наследовать list
.
import json
task1 = {
'record_id': '1,2,3',
'location': 'l1',
'instruction_parameters': {
'NAME': 'project_name1'
},
'marked_points': 'marked_points1',
'marked_polygons': 'marked_polygons1',
}
task2 = {
'record_id': '8,7,3',
'location': 'l2',
'instruction_parameters': {
'NAME': 'project_name2'
},
'marked_points': 'marked_points2',
'marked_polygons': 'marked_polygons2',
}
task3 = {
'record_id': '3,1,2',
'location': '',
'instruction_parameters': {
'NAME': 'project_name3'
},
'marked_points': 'marked_points3',
'marked_polygons': 'marked_polygons3',
}
class Tasks(list):
def get_identifier(self, s):
s = s.replace(" ","")
return sorted(list(map(int, s.split(","))))
def compare_tasks(self, first_task, second_task):
if self.get_identifier(first_task['record_id']) == self.get_identifier(second_task['record_id']):
return True
return False
def append(self, new_task):
task_exist = False
for task in self:
if self.compare_tasks(task, new_task):
task_exist = True
#raise ValueError('Task already in list: {}'.format(new_task))
if task_exist == False:
super().append(new_task)
tasks = Tasks()
tasks.append(task1)
tasks.append(task2)
tasks.append(task3)
print(json.dumps(tasks, indent = 4))
Выход:
[
{
"location": "l1",
"marked_points": "marked_points1",
"instruction_parameters": {
"NAME": "project_name1"
},
"record_id": "1,2,3",
"marked_polygons": "marked_polygons1"
},
{
"location": "l2",
"marked_points": "marked_points2",
"instruction_parameters": {
"NAME": "project_name2"
},
"record_id": "8,7,3",
"marked_polygons": "marked_polygons2"
}
]
Вы можете поднять ValueError
для добавления дублирующейся задачи в tasks
.
Чтобы поднять ValueError
, раскомментируйте следующий комментарий:
#raise ValueError('Task already in list: {}'.format(new_task))
Разъяснения:
Tasks
наследует list
.
- Каждое задание имеет уникальный идентификатор: отсортированный список клавиш
record_id
.
- Две задачи идентичны, если имеют одинаковый уникальный идентификатор.
json.dumps
используется для отображения списка с правильным отступом.