Сортировка списка путем сопоставления списков ввода в Python - PullRequest
0 голосов
/ 17 февраля 2020

У меня есть (возможно, довольно простая) проблема, которую я не могу понять в Python.

Скажем, у меня есть список X1 = [1,2,3] с соответствующим списком Y1 = [5,6,7] и список X2 = [2,1,3] с соответствующим list Y2 = [8,9,10], где X1 и X2 содержат одинаковые значения, но в другом порядке. Как можно сопоставить порядок X2 с порядком X1, в то время как пары X2 Y2 остаются неизменными? Ответ должен быть тогда Y2 = [9,8,10].

Заранее спасибо!

Ответы [ 3 ]

0 голосов
/ 17 февраля 2020

вы можете играть с почтовым индексом

Ваш код:

x1 = [1, 2, 3]
y1 = [5, 6, 7]

x2 = [2, 1, 3]
y2 = [8, 9, 10]

Шаг 1 Почтовый список:

z1 = list(zip(x1, y1))    
z2 = list(zip(x2, y2))

ВЫХОД:

[(1, 5), (2, 6), (3, 7)]
[(2, 8), (1, 9), (3, 10)]

Шаг 2 отсортировать новые списки:

z1.sort()
z2.sort()

ВЫХОД:

[(1, 5), (2, 6), (3, 7)]
[(1, 9), (2, 8), (3, 10)]

Список шагов 3 снова сжать их с помощью *

z1 = list(zip(*z1))
z2 = list(zip(*z2))

ВЫХОД:

[(1, 2, 3), (5, 6, 7)]
[(1, 2, 3), (9, 8, 10)]

СЕЙЧАС поместите значения обратно:

x1 = z1[0]
y1 = z1[1]
x2 = z2[0]
y2 = z2[1]

ВЫХОД:

x1 = (1, 2, 3)
y1 = (5, 6, 7)
x2 = (1, 2, 3)
y2 = (9, 8, 10)

Помните, x1, x2, y1, y2 теперь кортеж, если вы хотите быть списком вам нужен еще один шаг

x1 = list(x1)
x2 = list(x2)
y1 = list(y1)
y2 = list(y2)

Вывод:

x1 = [1, 2, 3]
y1 = [5, 6, 7]
x2 = [1, 2, 3]
y2 = [9, 8, 10]
0 голосов
/ 17 февраля 2020
n = len(X1)
inds = range(n)
d = {X2[i_]:Y2[i_] for i_ in inds}   
nY2 = [d[X1[i_]] for i_ in inds]
0 голосов
/ 17 февраля 2020

Вы можете сделать что-то вроде этого:

[Y2[X1.index(x)] for x in X2]

Это имеет O (n ^ 2) временную сложность, если вы строите словарь с индексами X1 раньше, вы можете получить O (n) временную сложность :

d = {x: i for i, x in enumerate(X1)}
[Y2[d[x]] for x in X2]
...