У меня два списка диктовок. Давайте назовем первый как dd
:
dd = [{'11': {'xx': '259', 'priority': '1', 'channels': '55'}},
{'11': {'xx': '260', 'priority': '2', 'channels': '35'}},
{'11': {'xx': '270', 'priority': '3', 'channels': '35'}},
{'22': {'xx': '300', 'priority': '1', 'channels': '40'}},
{'22': {'xx': '303', 'priority': '2', 'channels': '30'}},
{'33': {'xx': '400', 'priority': '1', 'channels': '40'}},
{'33': {'xx': '500', 'priority': '2', 'channels': '30'}},
{'33': {'xx': '606', 'priority': '3', 'channels': '30'}}]
Ключевые особенности элемента dict: id
ie 11,22,33
и priority
ie 1,2,3..
Другой dict
- это фильтр dict
:
filter_dict = [{'11': 2}, {'33': 2}]
Этот фильтр dict
имеет key-value
, где key
определяет id
в первом dict
dd
, а значение означает количество элементов, которые должны быть выбраны из первого dict dd
, т.е. {'11': 2}
означает выбор верхних 2
элементов из dd
на основе priority
. И выберите только 1 элемент с высшим приоритетом из dd
, если filter_dct
не имеет соответствующего id
в нем.
То, что у меня есть до сих пор, - это способ получить только 1 элемент с высшим приоритетом из dd
на основе priority
:
tmp = {}
for elem in dd:
tmp.setdefault([*elem][0], []).append(elem)
out = [subl[0] for subl in tmp.values()]
print(out)
Желаемый результат, которого я пытаюсь достичь:
res = [{'11': {'xx': '259', 'priority': '1', 'channels': '55'}},
{'11': {'xx': '260', 'priority': '2', 'channels': '35'}},
{'22': {'xx': '300', 'priority': '1', 'channels': '40'}}, # one elem because no record in the filter_dict
{'33': {'xx': '400', 'priority': '1', 'channels': '40'}},
{'33': {'xx': '500', 'priority': '2', 'channels': '30'}}]
EDIT:
Предлагаемые решения терпят неудачу, когда элементов больше 4.
т.е. для входа:
dd = [{'11': {'xx': '259', 'priority': '1', 'channels': '55'}},
{'11': {'xx': '260', 'priority': '2', 'channels': '35'}},
{'11': {'xx': '270', 'priority': '4', 'channels': '35'}},
{'11': {'xx': '260', 'priority': '9', 'channels': '35'}},
{'11': {'xx': '270', 'priority': '11', 'channels': '35'}},
{'22': {'xx': '300', 'priority': '1', 'channels': '40'}},
{'22': {'xx': '303', 'priority': '2', 'channels': '30'}},
{'33': {'xx': '400', 'priority': '1', 'channels': '40'}},
{'33': {'xx': '500', 'priority': '2', 'channels': '30'}},
{'33': {'xx': '606', 'priority': '3', 'channels': '30'}}]
на выходе:
[{'11': {'xx': '259', 'priority': '1', 'channels': '55'}}, {'11': {'xx': '270', 'priority': '11', 'channels': '35'}}, {'11': {'xx': '260', 'priority': '2', 'channels': '35'}}, {'22': {'xx': '300', 'priority': '1', 'channels': '40'}}, {'33': {'xx': '400', 'priority': '1', 'channels': '40'}}]
Что неверно.