【问题标题】:Python - Array won't shuffle and printPython - 数组不会洗牌和打印
【发布时间】:2019-02-22 20:45:15
【问题描述】:
import random 

def shuffle(ary):

    ary = [1,2,3,4,5]
    d=len[ary]
    b=d-1
    while (d > 0):
        x=random.randint(0,d)
        if x == d: 
            ary[b],ary[x]=ary[x],ary[d]
    return ary

print("shuffle list" + str(shuffle(ary)))

【问题讨论】:

  • 你这里有一些安静的地方需要修复,但对于初学者来说,你试图将你在函数中定义的变量传递给你的函数
  • 你的 while 循环永远不会退出,你有 while d > 0 d 什么时候不会大于 0?

标签: python arrays shuffle


【解决方案1】:

我还没有通过你的逻辑。只是在语法上更正了您的代码。您在未初始化的情况下通过了列表。已经创建了一个无限循环(从未减少参数 d)

import random 
ary = [1,2,3,4,5]

def shuffle(ary):
    d=len(ary)
    b=d-1
    while (d > 0):
        x=random.randint(0,b)
        if x == d: 
            ary[b],ary[x]=ary[x],ary[d]
        d=d-1
    return ary

print("shuffle list" + str(shuffle(ary)))

【讨论】:

    【解决方案2】:

    仅供参考随机包中有一个预定义的shuffle函数

    import random
    array = [1, 2, 3, 4]
    random.shuffle(array) # shuffles in place
    print("My shuffled list", array)
    

    对于您的情况,您需要在将数组传递给函数之前定义数组

    ary = [1, 2, 3, 4]
    print(shuffle(ary))
    

    【讨论】:

    • 这给了我错误 TypeError: 'builtin_function_or_method' object is not subscriptable
    • 使用标准函数还是你的?
    【解决方案3】:

    你有一些错误,我已经为你解决了,我会分解它,目前正在解释你出错的所有部分。

    import random 
    
    def shuffle(some_ary, mixes): 
        d = len(some_ary) - 1
        for i in range(mixes): 
            x = random.randint(0, d)
            y = random.randint(0, d)
            while y == x:
                y = random.randint(0, d)
            some_ary[x], some_ary[y] = some_ary[y], some_ary[x]
        return some_ary
    
    ary = [1,2,3,4,5]
    print(f"Shuffle: {shuffle(ary, 10)}")
    
    (xenial)vash@localhost:~/python/stack_overflow$ python3.7 shuffle.py 
    Shuffle: [5, 2, 3, 4, 1]
    

    第一件事:

    def shuffle(ary):
    
        ary = [1,2,3,4,5]
    

    您将 ary 贴在函数内部,我们需要将其移到外部,以便我们可以使用 suffle(ary) 将其传递给函数

    d=len[ary]
    b=d-1
    

    这应该是一行d = len[ary] - 1

    while (d > 0):
    

    现在好东西 :) 首先我们有 while(d > 0),如果你想使用它,我们必须添加一些最终结束这个循环的东西,所以在每次运行后让我们添加一个 d -= 1,但即使这样你也应该使用for loop 而不是for i in range(mixes) 不需要在这里使用d,因为周期的数量实际上取决于您,您走得越高,我们将获得更多的随机化。在此示例中,让我们将 mixes 与我们的数组一起传递。

    接下来我们的洗牌:

        x=random.randint(0,d)
    

    在您的代码上下文中,这将是05 之间的随机数,因为lists0 索引开始,您当前的ary 具有来自0-4 的索引 所以我们想要一个在那个范围内的随机整数,在你的代码中这应该是b,因为bd - 1

    if x == d:
    

    如果说if the random int == 5 超出了索引范围,我们假设您的意思是4,所有这一切只会给我们一个4 的索引,这不是' t 我们想要的洗牌我们想要一个随机索引,所以让我们摆脱它。

    让我们取另一个随机变量来交换,所以我们总是交换两个随机数

    y = random.randint(0, b)
    while y == x:
        y = random.randint(0, b)
    

    这里我们为索引生成另一个随机数,但也要确保它不等于我们正在交换的那个

    最后我们交换:

    ary[b],ary[x]=ary[x],ary[d]
    

    同样,如果我们使用这种方法,我们只会将最后一个数字与随机数字交换,更不用说d 会超出范围`

    some_ary[x], some_ary[y] = some_ary[y], some_ary[x]
    

    让我们交换两个随机位置

    然后我们可以:

    results = shuffle(ary, 10)
    print(results)
    

    print(f"{shuffle(ary, 10)}")
    

    希望这会有所帮助! :)

    【讨论】:

    • @carlosvelasquez 很高兴为您提供帮助!如果这解决了您的问题,如果您检查已解决,将不胜感激,干杯!
    猜你喜欢
    • 1970-01-01
    • 2012-04-03
    • 2015-04-15
    • 1970-01-01
    • 1970-01-01
    • 2013-06-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多