将一个列表转换为另一个列表

时间:2018-11-23 07:33:55

标签: 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)

将元素移动到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]

2 个答案:

答案 0 :(得分:1)

a = [0,1,2,3,4,5,6,7,8,9]
b = [2,4,6,7,0,1,3,5,8,9]

move(0,8)
a = [1、2、3、4、5、6、7、0、8、9]

move(0,8)
a = [2、3、4、5、6、7、0、1、8、9]

move(1,8)
a = [2,4,5,6,7,0,1,3,8,9]

move(2,8)
a = [2,4,6,7,0,1,3,5,8,9]

a == b

希望这就是您要寻找的。

基本上,从最左侧的元素开始,然后将其移动到应有的位置。例如,我取0并将其放在应该最终结束的值之后,即7。我继续从左向右移动,直到所有元素都按期望的顺序排列。

答案 1 :(得分:1)

我要遍历第二个序列(排序列表),并在第一个序列中交换项目。我用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函数并删除函数调用来稍微提高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

稍微好一点,但是可以肯定,有更好的方法可以实现这一目标。