Сортировка вложенного списка на основе другого вложенного списка

У меня есть два вложенных списка, x1 и x2. Мне нужно прибегнуть к x2 на основе порядка x1[0][0].

Я пытался использовать sort() и некоторые из lambda x, но не совсем уверен, как к этому подойти.

x1 = [["d", 0.4, 1],
     ["c", 0.5, 2],
     ["b", 0.3, 3],
     ["a", 0.5, 4]]

x2 = [["c", 4, 1],
     ["d", 2, 2],
     ["a", 6, 3],
     ["b", 6, 4]]

Я ожидаю получить следующий вывод для переупорядоченного x2

x2 = [["d", 2, 2],
     ["c", 4, 1],
     ["b", 6, 4],
     ["a", 6, 3]]

Я не могу полагаться на переупорядочивание в алфавитном порядке, поскольку набор данных, который я использую, отличается от этого, и я могу столкнуться с другими проблемами. В идеале мне нужно написать что-то, что будет просто сопоставлять каждый вложенный список с порядком, в котором x2 появляется в x1, основываясь только на первом элементе каждого вложенного списка (который всегда является строкой).

Мне нужно сделать это, используя только стандартную библиотеку Python.


person Jamie Cook    schedule 27.04.2019    source источник
comment
Пример не ясен. Это было бы эквивалентно сортировке на основе порядка сортировки первых элементов самого x2.   -  person Austin    schedule 27.04.2019
comment
@Остин, я только что обновил его, чтобы лучше отражать то, что мне нужно. Извините, я был неясен. Базовая сортировка сработала бы с тем, что у меня было, но не с моим реальным набором данных.   -  person Jamie Cook    schedule 27.04.2019


Ответы (2)


Вы можете создать словарь, который сопоставляет ключи в x1 с его индексом, используя enumerate, а затем сортирует x2 с помощью ключевой функции, которая возвращает индекс из сопоставленного ключа:

order = {k: i for i, (k, *_) in enumerate(x1)}
x2.sort(key=lambda t: order[t[0]])

x2 становится:

[['a', 3], ['b', 1], ['c', 4], ['d', 2]]
person blhsing    schedule 27.04.2019
comment
@blhsing, спасибо за помощь! Я только что обновил данные, чтобы лучше отражать реальный набор данных, который я использую. Я получаю ValueError, используя ваше решение для моих данных из-за наличия дополнительного значения. - person Jamie Cook; 27.04.2019
comment
Рад помочь. Тогда я обновил свой ответ. - person blhsing; 27.04.2019

попробуйте следующее:

x1 = [["a", 1],
     ["b", 2],
     ["c", 3],
     ["d", 4]]

x2 = [["b", 1],
     ["d", 2],
     ["a", 3],
     ["c", 4]]

x2.sort(key=lambda k: dict(x1)[k[0]])

x2

это выводит

[['a', 3], ['c', 4], ['b', 1], ['d', 2]]
person avloss    schedule 27.04.2019