Algorithm 将一个列表转换为另一个列表
例如,给定两个列表:Algorithm 将一个列表转换为另一个列表,algorithm,Algorithm,例如,给定两个列表: a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] b = [2, 4, 6, 7, 0, 1, 3, 5, 8, 9] 我希望找到一系列动作,将列表a转换为列表b,其中每个动作都是一个操作: move(from_index, to_index) 它将元素从_索引移动到位置,并将其放置到_索引。因此,如果: a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 然后,列表a上的操作move(3,1)将a转换为: a = [0, 3,
a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
b = [2, 4, 6, 7, 0, 1, 3, 5, 8, 9]
我希望找到一系列动作,将列表a转换为列表b,其中每个动作都是一个操作:
move(from_index, to_index)
它将元素从_索引移动到位置,并将其放置到_索引。因此,如果:
a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
然后,列表a上的操作move(3,1)将a转换为:
a = [0, 3, 1, 2, 4, 5, 6, 7, 8, 9]
a=[0,1,2,3,4,5,6,7,8,9]
b=[2,4,6,7,0,1,3,5,8,9] 移动(0,8)
a=[1,2,3,4,5,6,7,0,8,9] 移动(0,8)
a=[2,3,4,5,6,7,0,1,8,9] 移动(1,8)
a=[2,4,5,6,7,0,1,3,8,9] 移动(2,8)
a=[2,4,6,7,0,1,3,5,8,9] a==b 希望这就是你想要的
基本上,从最左边的元素开始,并将其移动到应该的位置。例如,我取0并将其放在它最终应该落在后面的值后面,即7。我继续从左向右移动,直到所有元素都按所需顺序排列 我将迭代第二个序列(排序列表)并交换第一个序列中的项目。我用python编写了以下伪代码:
>>> a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> b = [2, 4, 6, 7, 0, 1, 3, 5, 8, 9]
>>> def swap(seq, i, j):
... a = seq[i]
... seq[i] = seq[j]
... seq[j] = a
...
>>> for index_in_b, value in enumerate(b):
... index_in_a = a.index(value)
... if index_in_b != index_in_a:
... swap(a, index_in_a, index_in_b)
... print('move {} to {}'.format(index_in_a, index_in_b))
move 0 to 2
move 1 to 4
move 2 to 6
move 3 to 7
move 4 to 6
move 5 to 6
move 6 to 7
在本例中,我通过交换来移动第一个序列中的项目
更新
通过删除swap函数中的move和函数调用,我们可以稍微提高python的性能。以下是性能比较:
import timeit
s1 = """
a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
b = [2, 4, 6, 7, 0, 1, 3, 5, 8, 9]
def swap(seq, i, j):
a = seq[i]
seq[i] = seq[j]
seq[j] = a
for index_in_b, value in enumerate(b):
index_in_a = a.index(value)
if index_in_b != index_in_a:
swap(a, index_in_a, index_in_b)"""
s2 = """
a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
b = [2, 4, 6, 7, 0, 1, 3, 5, 8, 9]
for index_in_b, value in enumerate(b):
index_in_a = a.index(value)
if index_in_b != index_in_a:
a[index_in_a], a[index_in_b] = a[index_in_b], a[index_in_a]"""
# on an i7 macbook pro
timeit.timeit(s1)
4.087386846542358
timeit.timeit(s2)
3.5381240844726562
稍微好一点,但肯定有更好的方法来实现这一点。转换总是可能的吗?这是Python吗?这些列表是相互排列的吗?你是在寻找更具体的东西,比如最小移动次数吗?所以基本上你想我想OP是在寻找一个通用算法,不是这件事的具体步骤。@MarkMeyer说得对。我只是在我的答案后面加了一个我的总体策略的总结。谢谢你的解决方案。它工作得很好。你能优化它,使它是最优的还是接近最优的?例如,当一次移动足够(移动(5,0))时,此算法需要5次移动来转换[0,1,2,3,4,5]->[5,0,1,2,3,4]。感谢您的解决方案,尽管将交换操作转换为两次移动操作的成本太高。我们可以通过一次移动两次操作来稍微加快转换速度。我将用timeit结果更新答案。