Проверить равенство перестановок, которые еще не отсортированы - PullRequest
0 голосов
/ 18 мая 2018

Мне нужно проверить две перестановки на равенство, однако они все еще не отсортированы.Допустим, у меня есть два списка кортежей, т.е.

l1 = [(1, 15.0), (2, 13.0), (3, 17.0)]
l2 = [(1, 12.0), (2, 14.0), (3, 10.0)]

После сортировки их по второму элементу в каждом кортеже списки будут выглядеть так:

l1 = [(2, 13.0), (1, 15.0), (3, 17.0)]
l2 = [(3, 10.0), (1, 12.0), (2, 14.0)]

НетЯ хотел бы проверить равенство перестановок, задаваемых порядком первого элемента в каждом кортеже:

[2, 1, 3] == [3, 2, 1]

Существует ли быстрый и простой способ пропустить полную сортировку обоих списков для повышения производительности?Мой текущий подход состоит в том, чтобы иметь генератор для каждого списка, который выдает следующий элемент в соответствии со 2-м элементом, и поэтому я могу мгновенно проверить на равенство.

1 Ответ

0 голосов
/ 18 мая 2018

Это одна numpy реализация, использующая numpy.argsort.Вы можете дополнительно оптимизировать в пределах numpy (использовать операции на месте), но производительность уже может быть достаточной для ваших нужд:

import numpy as np

l1 = [(1, 15.0), (2, 13.0), (3, 17.0)]
l2 = [(1, 12.0), (2, 14.0), (3, 10.0)]

a1 = np.array(l1)
a2 = np.array(l2)

res = (a1[a1[:,1].argsort()][:,0] == a2[a2[:,1].argsort()][:,0]).all()

# False
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...