如何从python中的字典中获取随机值


148

如何从中获得随机对dict?我正在制作一款游戏,您需要猜测一个国家的首都,并且需要随机出现的问题。

dict模样{'VENEZUELA':'CARACAS'}

我怎样才能做到这一点?

Answers:


259

一种方法是:

import random
d = {'VENEZUELA':'CARACAS', 'CANADA':'OTTAWA'}
random.choice(list(d.values()))

编辑:该问题在原始帖子发布后的几年内已更改,现在要求使用一对,而不是单个物品。现在的最后一行应该是:

country, capital = random.choice(list(d.items()))

141
这将在d.keys()列表中的Python 2.x中工作,但在d.keys()迭代器中的Python 3.x中则无效。您应该random.choice(list(d.keys()))改为这样做。
邓肯

21
@邓肯:我等不及所有第3方库都与Python 3.x兼容,因此Python问题不需要每个问题有2个答案。
Gerrat 2011年

9
怎么过了:d = {'VENEZUELA':'CARACAS', 'CANADA':'OTTAWA'}呵呵,为微妙的洗脑+1 ...
gentimouton 2014年

4
@gentimouton ...有趣,但也许我只是去每个国家人口最多的城市-不是首都:)
Gerrat 2014年

12
这样有效吗?如果dict变大,这种规模会扩大吗?
Spectral


14

试试这个:

import random
a = dict(....) # a is some dictionary
random_key = random.sample(a, 1)[0]

这绝对有效。


12

如果您不想使用该random模块,也可以尝试popitem()

>> d = {'a': 1, 'b': 5, 'c': 7}
>>> d.popitem()
('a', 1)
>>> d
{'c': 7, 'b': 5}
>>> d.popitem()
('c', 7)

由于dict 不保留订单,因此使用popitem可以从中获得任意(但不是严格随机)顺序的项目。

还请记住popitem,如docs中所述,从字典中删除键值对。

popitem()可用于破坏性地迭代字典


29
这有点不好,因为如果您在相同版本的python上以相同的顺序加载字典,则几乎可以肯定会获得相同的项。
Alex


31
python 3.6 dict实际上是订购的!这是非常重要的
还是Duan

7
这个答案是错误的。即使在3.6之前,也不会为您提供随机值,而是一个取决于项目的哈希值的值。
OBu

1
忽略与OP的请求不一致的情况,这种方式是克服由于next字典是映射而不适用于字典这一事实的好方法。(我来这里是为了灵感,仅此而已)。
Matteo Ferla

9
>>> import random
>>> d = dict(Venezuela = 1, Spain = 2, USA = 3, Italy = 4)
>>> random.choice(d.keys())
'Venezuela'
>>> random.choice(d.keys())
'USA'

通过在字典(国家/地区)的上调用random.choicekeys


2
嗨,我尝试使用您的方法从给定的词典中随机选择一个键,但是它不起作用。我的字典看起来像一个= {'walk':20,'run':80},当我使用random.choice(a.keys())时,出现类似“ dict_keys对象不支持索引”的错误。你知道怎么了吗 非常感谢!!!
beepretty

7
@beepretty dict.keys()返回一个可迭代的对象,而不是类似列表的对象。要解决该错误,请使用random.choice(list(d.keys()))
Greenstick '17

3
请改用random.sample,比将密钥复制到列表便宜。
steveayre

7

这适用于Python 2和Python 3:

随机密钥:

random.choice(list(d.keys()))

随机值

random.choice(list(d.values()))

随机键和值

random.choice(list(d.items()))

4

如果您不想使用random.choice(),可以尝试以下方式:

>>> list(myDictionary)[i]
'VENEZUELA'
>>> myDictionary = {'VENEZUELA':'CARACAS', 'IRAN' : 'TEHRAN'}
>>> import random
>>> i = random.randint(0, len(myDictionary) - 1)
>>> myDictionary[list(myDictionary)[i]]
'TEHRAN'
>>> list(myDictionary)[i]
'IRAN'

注意:您list(…)多次生成一个此处。怎么myDictionary_list = list(myDictionary)
Cadoiz

4

由于原始帖子想要这

import random
d = {'VENEZUELA':'CARACAS', 'CANADA':'TORONTO'}
country, capital = random.choice(list(d.items()))

(python 3样式)


3

由于这是家庭作业:

找出random.sample()哪个将选择并从列表中返回一个随机元素。您可以使用来获得字典键列表和来获得dict.keys()字典值列表dict.values()


5
random.sample并且random.choice不能与迭代器一起使用。他们需要知道序列的长度,而序列的长度无法通过迭代器来确定。
AFoglia

10
不,这不是家庭作业,我正在写它来帮助我西班牙语。
tekknolagi 2011年

3
random.sample返回k随机元素random.choice返回单个随机元素
Anentropic 2014年

是的...假设这是一个家庭作业问题,绝对不酷。这对社区有什么影响?
jvriesem

3

我假设您正在做一种测验的应用程序。对于这种应用程序,我编写了一个函数,如下所示:

def shuffle(q):
"""
The input of the function will 
be the dictionary of the question
and answers. The output will
be a random question with answer
"""
selected_keys = []
i = 0
while i < len(q):
    current_selection = random.choice(q.keys())
    if current_selection not in selected_keys:
        selected_keys.append(current_selection)
        i = i+1
        print(current_selection+'? '+str(q[current_selection]))

如果我将给出的输入questions = {'VENEZUELA':'CARACAS', 'CANADA':'TORONTO'}并调用函数shuffle(questions),则输出将如下所示:

委内瑞拉?卡拉卡斯
加拿大?多伦多

您还可以通过改组选项进一步扩展此范围


您不应该像这样编程而不进行替换。想象一下绘制100个元素中的第100个-击中元素的概率为99%selected_keys。您可能会重复大约100次。至少像这样删除q的已获取键del(q[current_selection])-您可以selected_keysq = selected_keys在所有操作之后一样用新改组的q覆盖q 。也不要忘记识别!或者看一下我的np.random.choice(...)方法:stackoverflow.com/a/62843377/4575793
Cadoiz

1

试试这个(使用来自项目的random.choice)

import random

a={ "str" : "sda" , "number" : 123, 55 : "num"}
random.choice(list(a.items()))
#  ('str', 'sda')
random.choice(list(a.items()))[1] # getting a value
#  'num'

1

与Python(自3)的现代版本,对象的方法返回dict.keys()dict.values()dict.items()在视图对象*。嘿可以迭代,因此直接使用random.choice是不可能的,因为现在它们不是列表或集合。

一种选择是使用列表理解来完成以下工作random.choice

import random

colors = {
    'purple': '#7A4198',
    'turquoise':'#9ACBC9',
    'orange': '#EF5C35',
    'blue': '#19457D',
    'green': '#5AF9B5',
    'red': ' #E04160',
    'yellow': '#F9F985'
}

color=random.choice([hex_color for color_value in colors.values()]

print(f'The new color is: {color}')

参考文献:


0
b = { 'video':0, 'music':23,"picture":12 } 
random.choice(tuple(b.items())) ('music', 23) 
random.choice(tuple(b.items())) ('music', 23) 
random.choice(tuple(b.items())) ('picture', 12) 
random.choice(tuple(b.items())) ('video', 0) 

2
欢迎使用Stack Overflow!感谢您提供此代码段,它可能会提供一些有限的短期帮助。通过说明为什么这是一个很好的解决方案,正确的解释将大大提高其长期价值,并且对于其他存在类似问题的读者来说,它将变得更加有用。请编辑您的答案以添加一些解释,包括您所做的假设。
Toby Speight,

0

我通过寻找一个相当可比的解决方案找到了这篇文章。为了从一个字典中挑选多个元素,可以使用:

idx_picks = np.random.choice(len(d), num_of_picks, replace=False) #(Don't pick the same element twice)
result = dict ()
c_keys = [d.keys()] #not so efficient - unfortunately .keys() returns a non-indexable object because dicts are unordered
for i in idx_picks:
    result[c_keys[i]] = d[i]
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.