为了账号安全,请及时绑定邮箱和手机立即绑定

random.choice 中的奇怪行为

random.choice 中的奇怪行为

慕盖茨4494581 2021-06-10 10:25:12
我正在尝试使用我的scramble函数随机重新排序数组:def scramble(arr):    arr_len = len(arr)    container = [None]*arr_len    indexes = [i for i in range(arr_len)]    print(random.choice(indexes))       # works as expected    for i in range(arr_len):        my_choice = None        while not my_choice:            my_choice = random.choice(indexes)            print(my_choice)        # always None            if my_choice is not None:                indexes[my_choice] = None                container[my_choice] = arr[my_choice]    print(container)scramble([2,3,4,5,6])                  我面临的问题是my_choice变量总是包含None. 任何人都可以指出我缺少什么吗?
查看完整描述

2 回答

?
PIPIONE

TA贡献1829条经验 获得超9个赞

上面代码的问题在行中while not my_choice:。请记住,该my_choice变量可以同时包含 0 和None(这两个值都是假的)。


因此,我建议将您的代码更改为这样的内容(如果您不想使用random.shuffle):


def scramble(arr):

    arr_len = len(arr)

    container = [None]*arr_len

    indexes = [i for i in range(arr_len)]

    # print(random.choice(indexes))       # works as expected

    for i in range(arr_len):

        # print("i is {}".format(i))

        my_choice = None

        # while not my_choice:

        while my_choice is None:

            my_choice = random.choice(indexes)

            print(my_choice)        # always None

            if my_choice is not None:

                indexes[my_choice] = None

                container[i] = arr[my_choice]

    print(container)


scramble([2,3,4,5,6])

另外,做container[i] = arr[my_choice]而不是container[my_choice] = arr[my_choice]


查看完整回答
反对 回复 2021-06-16
?
暮色呼如

TA贡献1853条经验 获得超9个赞

出现问题是因为您设置indexes[my_choice]为 None,结果在某些时候indexes列表中的所有元素都是None,而 while 循环变得永无止境。


要打乱列表,您可以使用标准库中的random.shuffle函数:


import random


arr = [2,3,4,5,6]

random.shuffle(arr)

print arr


查看完整回答
反对 回复 2021-06-16
  • 2 回答
  • 0 关注
  • 235 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号