如何根据第二个索引列表重新排列一个列表

时间:2017-01-09 13:31:22

标签: python python-2.7 list

我有一个包含10个项目的列表,以及另外10个随机不重复的数字列表,如下所示:

l = [a,b,c,d,e,f,g,h,i,j]
m = [1,4,5,9,2,6,3,7,8,10]

我想重新排列l,以便l中的每个项目都从m获取相应的索引。

例如,b应该成为第四个,e成为第二个。

我真的陷入了算法困境,逻辑让我烦恼,所以我对如何处理这个问题一无所知。

我该怎么做?

3 个答案:

答案 0 :(得分:6)

如果您只是尝试根据其他列表位置移动元素,则可以循环遍历m的所有元素并使用列表理解获取l的元素

l2 = [l[i - 1] for i in m] 

但如果您确实希望基于其他列表进行排序,那么您需要将它们压缩在一起,对索引进行排序,然后提取元素

[y for x,y in sorted(zip(m,l))] 

答案 1 :(得分:3)

注意:我假设m始终是连续的(即没有“空白”),并从1开始。

如果是这样,您可以使用列表理解zip()sorted()轻松获得您想要的内容。

让我们一步一步来看:

>>> l = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j']
>>> m = [1, 4, 5, 9, 2, 6, 3, 7, 8, 10]

zip()m的每个元素与l元素配对:

>>> zip(m, l)
[(1, 'a'), (4, 'b'), (5, 'c'), (9, 'd'), (2, 'e'), (6, 'f'), (3, 'g'), (7, 'h'), (8, 'i'), (10, 'j')]

sorted()返回对列表的排序副本:

>>> sorted(zip(m, l))
[(1, 'a'), (2, 'e'), (3, 'g'), (4, 'b'), (5, 'c'), (6, 'f'), (7, 'h'), (8, 'i'), (9, 'd'), (10, 'j')]

最后,列表理解仅采用每对中的第二项:

>>> [x for i, x in sorted(zip(m, l))]
['a', 'e', 'g', 'b', 'c', 'f', 'h', 'i', 'd', 'j']

答案 2 :(得分:0)

这可以在dict的帮助下在线性O(n)时间内完成:

l = ['a','b','c','d','e','f','g','h','i','j']
m = [ 1,  4,  5,  9,  2,  6,  3,  7,  8,  10]

values_by_index = dict(zip(m, l))
result = [values_by_index[index+1] for index in range(len(m))]

print(result)
# output: ['a', 'e', 'g', 'b', 'c', 'f', 'h', 'i', 'd', 'j']

第一行创建将索引映射到值的dict,如下所示:

>>> values_by_index
{1: 'a', 4: 'b', 5: 'c', 9: 'd', 2: 'e', 6: 'f', 3: 'g', 7: 'h', 8: 'i', 10: 'j'}

在第二行中,我们简单地循环索引1到10并从dict中获取相应的值,这是一般情况下的O(1)操作。

如果您有从0开始的索引,只需从+1移除index+1