Сортировать список диктов по другому

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

list_1 = [{'document_id': Ƌ'}, {'document_id': ƈ'}, {'document_id': Ɗ'}]

list_2 = [{'document_id': Ɗ', 'page_id': Ƈ'}, {'document_id': Ƌ', 'page_id': ƈ'}, {'document_id': Ƌ', 'page_id': Ƈ'}]

list_1 - это расширенный набор list_2 с точки зрения document_id если это помогает.

Я хочу

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

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

new_list_2 = [{'document_id': Ƌ', 'page_id': Ƈ'}, {'document_id': Ƌ', 'page_id': ƈ'}, {'document_id': Ɗ', 'page_id': Ƈ'}]

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

Всего 2 ответа


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

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

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

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

>>> list_2
[{'document_id': Ƌ', 'page_id': Ƈ'},
 {'document_id': Ƌ', 'page_id': ƈ'},
 {'document_id': Ɗ', 'page_id': Ƈ'}]

  1. Это в основном то же самое, что и Как отсортировать список по другому списку? Разница лишь в том, что вам нужно сначала получить идентификаторы документа из list_1 .
  2. Смотрите Сортировать список по нескольким атрибутам?

Все вместе:

docs_1 = [d['document_id'] for d in list_1]  # = [Ƌ', ƈ', Ɗ']
list_2.sort(key=lambda d: (docs_1.index(d['document_id']), d['page_id']))

Есть идеи?

10000