按另一个列表的顺序对python列表进行排序并检索旧索引

时间:2019-05-07 10:36:41

标签: python list sorting indexing

试图检索排序列表“第二”的索引。 “第二”包含与“第一”相同的值,并且将重新排序以成为与“第一”相同的顺序。我正在寻找索引列表“ d”,其中包含旧“第二”中重新排序的索引。

尝试使用zip或枚举检索“ d”,但失败。

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”?

我尝试过:     d = [i [0] for i in sorted(enumerate(second),key = first.index)]

在此示例中,“ d”应变为[2,0,1]

这种类型的键在某种程度上阻止了检索旧索引的可能性。有什么建议吗?

4 个答案:

答案 0 :(得分:0)

这是一种方法。

例如:

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]

答案 1 :(得分:0)

如果我正确理解了您的问题,则可以使用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会将索引包含到原始列表中,这样,如果您按应用于原始列表的顺序使用它们,则会对列表进行排序。

答案 2 :(得分:0)

您可以再次使用index来获取原始列表中的索引,但是(a)如果元素重复,这可能会失败,并且(b)具有两次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]

答案 3 :(得分:0)

这将有助于:

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