Сортировать список питонов по порядку другого списка И получить старый индекс - PullRequest
1 голос
/ 07 мая 2019

Попытка получить индекс отсортированного списка «второй».«second» содержит те же значения, что и «first», и будет переупорядочен, чтобы стать идентичным порядку «first».Я ищу индекс-лист "d", который содержит переупорядоченные индексы из старого "second".

пытался получить "d" с помощью zip или перечисления, но не смог.

first= [(11.373,0.354,6.154),(22.354,0.656,0.664),(33.654,33.546,31.131)]
second=[(22.354,0.656,0.664),(33.654,33.546,31.131),(11.373,0.354,6.154)]

second=sorted(second,key=first.index)

print(first)
print(second)
[(11.373, 0.354, 6.154), (22.354, 0.656, 0.664), (33.654, 33.546, 31.131)]
[(11.373, 0.354, 6.154), (22.354, 0.656, 0.664), (33.654, 33.546, 31.131)]

Здесь «второй» становится таким же, как «первый».Здорово.Но как я могу получить переопределенный индексный список "d" из "second"?

Я пытался сделать следующее: d = [i [0] для i в отсортированном (enumerate (second), key = first.index)]

В этом примере «d» должно стать [2,0,1]

Этот тип ключа каким-то образом блокирует возможность получения старого индекса.Любая рекомендация?

Ответы [ 4 ]

0 голосов
/ 07 мая 2019

Это поможет:

sorted(range(len(second)),key=second.__getitem__)

также для получения элемента и индекса

sorted_indices, sorted_items = zip(*sorted([(i,e) for i,e in enumerate(second)], key=lambda x:x[1]))
0 голосов
/ 07 мая 2019

Если я правильно понял ваш вопрос, вы можете использовать numpy argsort и обойти необходимость «второй».

Вот фрагмент кода.

from pprint import pprint
import numpy

def main():
    first= [(11.373,0.354,6.154),(22.354,0.656,0.664),(33.654,33.546,31.131)]
    index_array= (numpy.argsort(first))
    for i in index_array:
        pprint(i.tolist())

if __name__== "__main__":
    main()

Вывод:

[1, 2, 0]
[1, 2, 0]
[2, 1, 0]

Помните, index_array содержит индексы в исходном списке, так что если вы используете их в том порядке, который применяется к исходному списку, список сортируется.

0 голосов
/ 07 мая 2019

Вы можете использовать index снова, чтобы получить индекс в исходном списке, но (а) это может не сработать, если есть повторяющиеся элементы, и (б) это имеет O (n²), дважды. Вместо этого я бы предложил использовать enumerate(first) для первого сопоставления элементов их индексам, а затем sorting пар (index, element) из enumerate(second), используя индексы из этой карты в качестве ключа, чтобы получить отсортированные индексы из second.

>>> ind = {x: i for i, x in enumerate(first)}
>>> [i for i, x in sorted(enumerate(second), key=lambda t: ind[t[1]])]
[2, 0, 1]
0 голосов
/ 07 мая 2019

Это один подход.

Пример:

first= [(11.373,0.354,6.154),(22.354,0.656,0.664),(33.654,33.546,31.131)]
second=[(22.354,0.656,0.664),(33.654,33.546,31.131),(11.373,0.354,6.154)]

temp = sorted(second,key=first.index)            #Sorted List. 
d = list(map(lambda x: second.index(x), temp))   #Fetch index from temp

print(first)
print(temp)
print(d)

Выход:

[(11.373, 0.354, 6.154), (22.354, 0.656, 0.664), (33.654, 33.546, 31.131)]
[(11.373, 0.354, 6.154), (22.354, 0.656, 0.664), (33.654, 33.546, 31.131)]
[2, 0, 1]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...