【问题标题】:Is there a way to shuffle a list in python?有没有办法在python中洗牌?
【发布时间】:2019-05-04 11:07:54
【问题描述】:

我正在尝试使用随机 abc 进行简单的加密来转换它 但我的 Random 库有问题。

  1. 尝试使用人们在 StackOverflow 上针对此问题提出的其他一些答案,但均未奏效...
  2. 尝试更新 pip 并尝试更新 random(您显然不能使用 pip,因为 Random 库是用 python 预先下载的) 在 python Shell 中尝试了有问题的代码,仍然是同样的问题...
import random
def random(st = 'i love cats')
    abc = 'abcdefghijklmnopqrstuvwxyz'
    randomabc = abc
    random.shuffle(randomabc)
    print(randomabc)

预期输出是 ABC 的随机顺序 实际输出的是错误(代码在打印之前因为错误而停止)

【问题讨论】:

  • 如果你给你的方法命名与导入的模块相同,它会隐藏模块。
  • randomabc = list(abc); random.shuffle(randomabc); return "".join(randomabc)

标签: python random shuffle


【解决方案1】:

正如我在 cmets 中提到的,你应该给你的函数命名不同于 python 关键字、导入的模块、类名等。尝试将你的方法从 random 重命名为 random_alphabet

import random

def random_alphabet(st = 'i love cats'):
    pass

【讨论】:

  • 这个答案仍然没有解决字符串没有被洗牌的话题@AmitKeren!
【解决方案2】:

因为abc 是一个字符串,它是不可变的(你不能就地改变它)你不能那样做。

相反,您必须:

  1. 将字符串拆分成一个字符列表。

  2. 随机播放该列表

  3. 将字符列表重新加入字符串

import random

abc = 'abcdefghijklmnopqrstuvwxyz'
ls = list(abc)
random.shuffle(ls)
abc = ''.join(ls)

print(abc)

示例输出:

erbkvownuhcmfljtgqpyiazdxs

另外:切勿使用与标准库冲突的名称来命名您的函数或 .py 文件。在这种情况下,您的函数与 random 模块同名,这是一个大问题。

【讨论】:

  • abc.split() 很可能会返回一个 1 元素列表,这不是我们想要的......另外,random.shuffle 是一个就地操作并返回 None,所以代码实际上是 @ 987654328@ 这不起作用...
【解决方案3】:

你不能洗牌string,它是一个不可变的对象,一旦被分配就不能改变。 相反,您需要将其转换为一个列表(一个可变对象),通过random.shuffle 对列表进行随机播放,该列表会就地随机播放列表,然后将列表转换回字符串。

import random

abc = 'abcdefghijklmnopqrstuvwxyz'

#Convert string to list
li = list(abc)

#Shuffle the list inplace
random.shuffle(li)

#Convert list to string
print(''.join(li))

输出将是

dpfozwhyxalebnqrmstcjvuigk
qgjefyrahobpnxtzmsdkwivlcu
nchkriewsuxdzyjfgvpblomtqa
.....

除此之外,另一种选择(单行)是使用random.sample 选择len(abc) 独特的样本,并将它们全部连接到一个字符串中(感谢@JonClements),但它更适合一个关闭改组

print(''.join(random.sample(abc, len(abc))))

【讨论】:

  • 谢谢@JonClements 更新了我的回答,并指出你是发起人:)
  • 不会说它是一个很好的单线...如果您只是将其作为一个随机播放器来做,这只是一种不可怕的替代方案...如果您反复去改组并产生结果或类似的结果,然后将其作为列表,然后重新改组列表会更好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-09-01
  • 2021-07-16
  • 1970-01-01
  • 2012-10-16
  • 2017-01-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多