Сортировать список диктов по другому - PullRequest
1 голос
/ 11 февраля 2020

У меня есть два списка диктов:

list_1 = [{'document_id': '5'}, {'document_id': '2'}, {'document_id': '4'}]

list_2 = [{'document_id': '4', 'page_id': '1'}, {'document_id': '5', 'page_id': '2'}, {'document_id': '5', 'page_id': '1'}]

list_1 - это расширенный набор list_2 в терминах document_id, если это помогает.

Я хочу

  1. сортировка list_2 в соответствии с list_1
  2. , затем сортировка list_2 на основе page_id для каждого отдельного document_id

Поэтому я хочу, наконец, иметь это:

new_list_2 = [{'document_id': '5', 'page_id': '1'}, {'document_id': '5', 'page_id': '2'}, {'document_id': '4', 'page_id': '1'}]

Как мне эффективно это сделать?

Ответы [ 2 ]

2 голосов
/ 11 февраля 2020

Создайте отображение порядка в list_1 через словарь.

docs = {doc.get('document_id'): n for n, doc in enumerate(list_1)}
# >>> docs
# {'5': 0, '2': 1, '4': 2}

Затем используйте порядок с page_id в качестве ключей сортировки.

list_2.sort(key=lambda r: (docs[r['document_id']], r['page_id']))

>>> list_2
[{'document_id': '5', 'page_id': '1'},
 {'document_id': '5', 'page_id': '2'},
 {'document_id': '4', 'page_id': '1'}]
0 голосов
/ 11 февраля 2020
  1. По сути, это то же самое, что и Как отсортировать список по другому списку? Единственное отличие состоит в том, что вам нужно сначала получить идентификаторы документа из list_1.
  2. См. Сортировать список по нескольким атрибутам?

Все вместе:

docs_1 = [d['document_id'] for d in list_1]  # = ['5', '2', '4']
list_2.sort(key=lambda d: (docs_1.index(d['document_id']), d['page_id']))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...