我有一个包含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
成为第二个。
我真的陷入了算法困境,逻辑让我烦恼,所以我对如何处理这个问题一无所知。
我该怎么做?
答案 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
。