【问题标题】:Shuffling a list洗牌列表
【发布时间】:2011-11-16 17:21:23
【问题描述】:

在这个程序中,我试图通过从列表中随机选择两个项目并交换它们来对列表进行洗牌,然后重复这个过程几次。

我遇到的问题是我不知道如何交换项目并打印打乱列表。

例如,如果我的两个随机值是 a 和 b,如果我要输入:

a = b
b = a

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

我认为这可行的唯一方法是同时交换它们,但我不知道交换它们的函数/方法。

另外,如果 a、b 是列表 L 的项目,在我使用它们交换之后

print L

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

注意我正在尝试通过交换逐步洗牌此列表,而不是使用从随机导入的洗牌功能。

【问题讨论】:

  • 当我还是个小伙子的时候,经典的交换方式是使用一个临时变量:tmp=a, a=b, b=tmp - 但是 python 比 BASIC 更聪明! [太蹩脚,不值得回答]

标签: python list swap


【解决方案1】:

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

a, b = b, a

这叫做多重赋值,你可以找到更多关于它的信息here

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

tmp = a
a = b
b = tmp

Python 不是很棒吗?

【讨论】:

    【解决方案2】:

    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
    

    【讨论】:

      【解决方案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]
      

      【讨论】:

        【解决方案4】:

        使用临时变量:

        temp = a
        a = b
        b = temp
        

        【讨论】:

          【解决方案5】:

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

          众所周知,仅仅交换物品是不好的。

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

          然后很难将 32 位数字为 52 的牌洗牌!比 2^32 大很多

          【讨论】:

            猜你喜欢
            • 2018-01-30
            • 2020-03-02
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-06-30
            相关资源
            最近更新 更多