【问题标题】:Random.choice not working correctly pythonRandom.choice 无法正常工作 python
【发布时间】:2017-04-01 20:21:07
【问题描述】:

例如,我有以下代码:

n = ['321','243','780']
b = ['12','56','90']
a = ['178', '765', '111']

E = input('Enter Word...')
qw = 1
Code = ('')
E_ready = [E[no:no+qw] for no in range(0, len(E), qw)]
for code in E_Ready:
   letter = random.choice(code)
   Code += letter

如果您输入单词“nba”,那么它将输出为“nba”,我希望它输出每个字母各自列表中的随机元素,例如“32112178”

【问题讨论】:

  • 实际上你确实想要那个,那是非常糟糕的设计:按名称调用是相当不安全的。你最好用字典。
  • 但是'n'不是一个列表,它是一个字符串; n 是一个列表。
  • 我本来打算用字典,但我真的不想用,除非你可以将变量分配给字典中的列表。
  • 我知道它将“代码”作为列表处理,那么我怎样才能让它获取代码的值并使用它
  • 你应该使用字典。

标签: python random


【解决方案1】:

正如威廉·范昂塞姆在 cmets 中正确提到的那样:

“……那真是糟糕的设计,按名称调用是相当不安全的。你最好使用字典。”

那么,试试这个:

n = {'option1':'321','option2':'243','option3':'780'}
letter = random.choice(list(n.values()))

或者,更短,正如 Chris 提到的:

d = {'n':[321, 243, 780]}
letter = random.choice(d['n'])

print(letter) 的结果(在两个选项上):

321
321
780
243
etc.. 

编辑

如何添加额外的变量:

n = 'n'
d = {n:[321, 243, 780]}
letter = random.choice(d[n])
q = 'q'
d[q] = [600, 234, 180]
new_letter = random.choice(d[q])

现在print(new_letter) 给出:

234
180
180
600
etc..

第二次编辑(顺便说一句,这是纯粹的奖励,因为问题变成了一个完全不同的问题,然后第一次问......因此,它没有被优化。但是,仍然可以工作......):

import random
d = {'n':[321, 243, 780], 'b':['12','56','90'], 'a':['178', '765', '111']}

E = input('Enter Word...')

inputword = list(E)

for key in d.keys():
    if key in inputword:
        for i in range(len(inputword)):
            if inputword[i] == key:
                try:
                    inputword[i] = str(random.choice(d[key]))
                except:
                    pass

result = ''.join(inputword)
print(result)

如果输入 = nba 那么输出 = 32190111

如果输入 = nhhsygbbvvra 则输出 = 321hhsyg5690vvr178

等等。

【讨论】:

  • 哦,我想我可以做到这一点,我会尝试并回复如果它有效。
  • 我还是想用一个变量 bec。我将有多个列表/字典,所以我需要像这样使用 random.choice(list(VariableName.values()))
  • 您能用您现在尝试执行的修改后的代码以及它给您的确切错误来更新您的问题吗?
  • 我刚做了,希望对您有帮助
  • 那么我该如何实现呢?
【解决方案2】:

好的,您有一些基本问题。 当您想将一个变量分配给另一个变量时,您不会将其放在引号中。 所以应该是:

code = n

但实际上我想知道为什么您需要变量代码。 你可以简单地做

import random
code = [ '321', '243', '780' ]
letter = random.choice(code)
print letter

【讨论】:

  • 我不能那样做。从更大的角度来看,我将从 for 循环中获取代码,因此我希望它从不同的列表中获取随机元素。
  • 查看 Willem van Onsem 对原始问题的评论,点名是不好的设计..
  • 就像我有 'a', 'b', 'c' 列表,我做了一个 for 循环,将返回 'a' , 'b' 或 'c' 所以我想要它相应列表中的随机元素。
  • @YousefRadwan 你真的不应该那样做。
【解决方案3】:

我同意评论,最好使用以下内容:

d = {'n':[mylist]}
letter = random.choice(d['n'])

问题是random.choice 也适用于字符串...它只是将它们视为字符列表。在您的情况下,代码变量和 n 应该完全相同,但实际上并非如此。你也可以这样做

n = [list]
code = n ## only makes any sense, if there 
         ## is a procedure assigns it based on some condition 
letter = random.choice(code)

【讨论】:

    猜你喜欢
    • 2023-03-26
    • 2012-04-10
    • 2018-10-10
    • 1970-01-01
    • 2016-12-01
    • 2017-11-07
    • 2020-03-18
    • 2012-09-22
    • 2019-02-15
    相关资源
    最近更新 更多