Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: Jamie CookОтветов: 2

У меня есть два вложенных списка, 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.

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

pythonsortingnested-listsstring-matching

Ответы

Ответ 1 · рейтинг 5 · blhsing

Вы можете создать словарь, который сопоставляет ключи в 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]]

Ответ 2 · рейтинг 2 · avloss

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

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]]

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы