试图检索排序列表“第二”的索引。 “第二”包含与“第一”相同的值,并且将重新排序以成为与“第一”相同的顺序。我正在寻找索引列表“ 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]
这种类型的键在某种程度上阻止了检索旧索引的可能性。有什么建议吗?
答案 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]))