我有以下列表:
a = [1, 2, 5, 4, 3, 6]
我想知道如何在列表中随时随机交换任何两个值,而不管列表中的位置如何。以下是我想到的一些示例输出:
[1, 4, 5, 2, 3, 6]
[6, 2, 3, 4, 5, 1]
[1, 6, 5, 4, 3, 2]
[1, 3, 5, 4, 2, 6]
有没有办法在Python 2.7中执行此操作?我目前的代码是这样的:
import random
n = len(a)
if n:
i = random.randint(0,n-1)
j = random.randint(0,n-1)
a[i] += a[j]
a[j] = a[i] - a[j]
a[i] -= a[j]
然而,我目前拥有的代码的问题是,在给定足够的交换和迭代时,它开始将所有值设置为零,这是我不想要的;我希望值在数组中保持不变,但是执行类似于2opt的操作,并且每次交换只会切换两次。
答案 0 :(得分:7)
看起来你过于复杂了。只需从列表中随机抽取两个索引,然后交换这些指标的值:
>>> def swap_random(seq):
... idx = range(len(seq))
... i1, i2 = random.sample(idx, 2)
... seq[i1], seq[i2] = seq[i2], seq[i1]
...
>>> a
[1, 2, 5, 4, 3, 6]
>>> swap_random(a)
>>> a
[1, 2, 3, 4, 5, 6]
>>> swap_random(a)
>>> a
[1, 2, 6, 4, 5, 3]
>>> swap_random(a)
>>> a
[1, 2, 6, 5, 4, 3]
>>> swap_random(a)
>>> a
[6, 2, 1, 5, 4, 3]
注意,我使用了Python swap idiom,它不需要中间变量。它相当于:
temp = seq[i1]
seq[i1] = seq[i2]
seq[i2] = temp