Skip to main content
 首页 » 编程设计

没有重复的Python random.choice方法

2025年05月04日44qq号

我正在尝试改进此代码,该代码要求用户在给定状态时说出州首府是什么,但我注意到有时它会重复一个状态并询问两次。

我尝试改用 random.sample,但出现错误“TypeError: Unhashable type: 'list'。以下代码有效(但重复),但 random.sample 被注释掉了:

capitals_dict = { 
    'Alabama': 'Montgomery', 
    'Alaska': 'Juneau', 
    'Arizona': 'Phoenix', 
    'Arkansas': 'Little Rock', 
    'California': 'Sacramento', 
    'Colorado': 'Denver', 
    'Connecticut': 'Hartford', 
    'Delaware': 'Dover', 
    'Florida': 'Tallahassee', 
    'Georgia': 'Atlanta', 
    'Hawaii': 'Honolulu', 
    'Idaho': 'Boise', 
    'Illinois': 'Springfield', 
    'Indiana': 'Indianapolis', 
    'Iowa': 'Des Moines', 
    'Kansas': 'Topeka', 
    'Kentucky': 'Frankfort', 
    'Louisiana': 'Baton Rouge', 
    'Maine': 'Augusta', 
    'Maryland': 'Annapolis', 
    'Massachusetts': 'Boston', 
    'Michigan': 'Lansing', 
    'Minnesota': 'St. Paul', 
    'Mississippi': 'Jackson', 
    'Missouri': 'Jefferson City', 
    'Montana': 'Helena', 
    'Nebraska': 'Lincoln', 
    'Nevada': 'Carson City', 
    'New Hampshire': 'Concord', 
    'New Jersey': 'Trenton', 
    'New Mexico': 'Santa Fe', 
    'New York': 'Albany', 
    'North Carolina': 'Raleigh', 
    'North Dakota': 'Bismarck', 
    'Ohio': 'Columbus', 
    'Oklahoma': 'Oklahoma City', 
    'Oregon': 'Salem', 
    'Pennsylvania': 'Harrisburg', 
    'Rhode Island': 'Providence', 
    'South Carolina': 'Columbia', 
    'South Dakota': 'Pierre', 
    'Tennessee': 'Nashville', 
    'Texas': 'Austin', 
    'Utah': 'Salt Lake City', 
    'Vermont': 'Montpelier', 
    'Virginia': 'Richmond', 
    'Washington': 'Olympia', 
    'West Virginia': 'Charleston', 
    'Wisconsin': 'Madison', 
    'Wyoming': 'Cheyenne', 
} 
 
import random 
 
states = list(capitals_dict.keys()) 
for i in [1, 2, 3, 4, 5]: 
    state = random.choice(states) 
    #state = random.sample(states, 5)  
    capital = capitals_dict[state] 
    capital_guess = input('What is the capital of ' + state + '?') 
 
    if capital_guess == capital: 
        print('Correct! Nice job!') 
    else: 
        print('Incorrect.  The Capital of ' + state + ' is ' + capital + '.') 
 
print('All done.') 

我也试过像这样使用字典名称 capitals_dict:

random.sample(capitals_dict, 5) 

但我遇到了一个不同的错误,然后我发现我不能那样使用字典。

请您参考如下方法:

您可以先将字典传递给 list() 函数,然后从该列表中采样,从而创建字典中所有键的列表:

sample = random.sample(list(capitals_dict), 5) 

也可以传入dict.keys()字典 View :

sample = random.sample(capitals_dict.keys(), 5) 

但在内部 random.sample() 也会将其转换为序列(tuple()),因此使用 list()在这里实际上效率更高。

您遇到的异常实际上告诉您:

>>> random.sample(capitals_dict, 5) 
Traceback (most recent call last): 
  File "<stdin>", line 1, in <module> 
  File "/.../lib/python3.4/random.py", line 311, in sample 
    raise TypeError("Population must be a sequence or set.  For dicts, use list(d).") 
TypeError: Population must be a sequence or set.  For dicts, use list(d). 
#                                                 ^^^^^^^^^^^^^^^^^^^^^^^ 

演示:

>>> import random 
>>> capitals_dict = { 
...     'Alabama': 'Montgomery', 
...     'Alaska': 'Juneau', 
...     'Arizona': 'Phoenix', 
...     'Arkansas': 'Little Rock', 
...     'California': 'Sacramento', 
...     # ... elided ... 
... } 
>>>  
>>> random.sample(list(capitals_dict), 5) 
['Maryland', 'Mississippi', 'Wisconsin', 'Texas', 'West Virginia'] 

将其合并到您的代码中:

随机导入

for state in random.sample(list(capitals_dict), 5): 
    capital = capitals_dict[state] 
    capital_guess = input('What is the capital of {}?'.format(state)) 
 
    if capital_guess == capital: 
        print('Correct! Nice job!') 
    else: 
        print('Incorrect. The Capital of {} is {}.'.format(state, capital)) 

我还用 str.format() 调用替换了您的字符串连接,以将值放入字符串模板中。