洗牌清单

时间:2011-11-16 17:21:23

标签: python list swap

在这个程序中,我试图通过从列表中随机选择两个项目并将它们交换来重新排列列表,然后多次重复此过程。

我遇到的问题是我不知道如何交换项目并打印洗牌清单。

例如,如果我的两个随机值是a和b,如果我只是放:

a = b
b = a

那么这会将a的值更改为b,但是当它尝试将b更改为a时,不会发生任何更改,因为已经更改为b。

我认为这样做的唯一方法是同时交换它们,但我不知道将它们交换的功能/方式。

此外,如果a,b是列表L中的项目,则在我使用

之后将它们换成圆形
print L

是否应该打印更改后的版本?我只是问,因为从我的尝试来看,它并没有这样做。

NB我试图通过交换逐步洗牌,而不是使用从随机导入的随机播放功能。

5 个答案:

答案 0 :(得分:4)

在Python中,你可以像这样交换两个变量:

a, b = b, a

这称为多重作业,您可以找到有关它的更多信息here

在其他语言中,这通常通过分配临时变量来完成:

tmp = a
a = b
b = tmp

Python不是很棒吗?

答案 1 :(得分:4)

random.shuffle 函数也使用交换。值得一看的是source code

def shuffle(self, x, random=None, int=int):
    """x, random=random.random -> shuffle list x in place; return None.

    Optional arg random is a 0-argument function returning a random
    float in [0.0, 1.0); by default, the standard random.random.
    """

    if random is None:
        random = self.random
    for i in reversed(xrange(1, len(x))):
        # pick an element in x[:i+1] with which to exchange x[i]
        j = int(random() * (i+1))
        x[i], x[j] = x[j], x[i]

观察最后一行如何使用tuple packing and unpacking执行交换。

作为打包和解包的替代方法,交换变量的传统方法是使用临时变量:

t    = x[i]
x[i] = x[j]
x[j] = t

答案 2 :(得分:3)

使用临时变量解决您的第一个问题:

temp = a
a = b
b = temp

在Python中你也可以这样做:

a, b = b, a

我怀疑你的第二个问题是因为你正在改变你从列表中得到的东西,而不是改变列表。试试这个:

i, j = # two indexes to swap in the list
L[i], L[j] = L[j], L[i]

答案 3 :(得分:1)

使用临时变量:

temp = a
a = b
b = temp

答案 4 :(得分:0)

http://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle

众所周知,交换物品很糟糕。

不要忘记,如果你有n个项目,那就有n个!安排。如果您的随机数是32位,则有2 ^ 32个数字。

然后很难将一包32位数的卡片洗牌为52!是非常大于2 ^ 32