【问题标题】:Swap two values randomly in list在列表中随机交换两个值
【发布时间】:2018-05-23 06:28:15
【问题描述】:

我有以下清单:

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]

然而,我目前拥有的代码的问题是,如果有足够的交换和迭代,它开始将 all 值设置为零,这是我不想要的;我希望数组中的值保持不变,但执行 2opt 之类的操作,每次交换时只切换两个。

【问题讨论】:

标签: python python-2.7 list


【解决方案1】:

您似乎过于复杂了。只需从 list 中随机抽取两个索引,然后交换这些索引处的值:

>>> 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

【讨论】:

  • 你能进一步解释一下最后两行代码的作用吗?看起来它需要两个值,但是......下一行是 a,b = b,a 开关吗?它是如何工作的?
  • @Leggerless,他们交换了列表中的两个元素。
  • 是一次只交换 2 个,还是有机会一次交换超过 2 个?
  • @Leggerless “交换”本质上适用于 2 个项目。例如,交换 3 个项目是什么意思?
  • @Leggerless 不,您对两个索引进行采样并交换这两个索引处的值...
猜你喜欢
  • 1970-01-01
  • 2017-06-17
  • 2018-08-17
  • 2016-05-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-28
  • 2019-04-27
相关资源
最近更新 更多