如何在python字典中获取随机值

tek*_*agi 135 python random dictionary key

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

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

我怎样才能做到这一点?

Ger*_*rat 235

一种方式(在Python 2.*中)将是:

import random
d = {'VENEZUELA':'CARACAS', 'CANADA':'OTTAWA'}
random.choice(list(d.keys()))
Run Code Online (Sandbox Code Playgroud)

编辑:问题在原始帖子后几年被更改,现在要求一对,而不是单个项目.最后一行应该是:

country, capital = random.choice(list(d.items()))
Run Code Online (Sandbox Code Playgroud)

  • 这将在Python 2.x中工作,其中`d.keys()`是一个列表,但它在Python 3.x中不起作用,其中`d.keys()`是一个迭代器.你应该做`random.choice(list(d.keys()))`. (135认同)
  • @Duncan:我不能等到所有第三方库都兼容Python 3.x,因此Python问题不需要每个问题的2个答案. (20认同)
  • 呃怎么样:`d = {'VENEZUELA':'加拉加斯','加拿大':'渥太华'}`嘿嘿,非常微妙的洗脑+1 (9认同)
  • 这有效吗?如果dict变得非常大,这会扩大吗? (9认同)
  • @gentimouton ...有趣,但也许我只是去了每个国家人口最多的城市 - 而不是首都:) (4认同)
  • @toto_tico:将迭代器更改为列表将是O(n) (2认同)
  • @Seaux:括号只是创建一个单项列表,其项是迭代器本身。他们不会创建一个列表,其项目是迭代器的项目。 (2认同)

小智 25

我写这个尝试解决同样的问题:

https://github.com/robtandy/randomdict

它具有O(1)随机访问键,值和项目.

  • 找到您的实际答案不是O(1) (8认同)

小智 16

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

>> d = {'a': 1, 'b': 5, 'c': 7}
>>> d.popitem()
('a', 1)
>>> d
{'c': 7, 'b': 5}
>>> d.popitem()
('c', 7)
Run Code Online (Sandbox Code Playgroud)

由于dict 不保留顺序,因此使用popitem从中获取任意(但不是严格随机)顺序的项目.

另外请记住,popitem文档中删除键值对,如文档中所述.

popitem()对于破坏性地迭代字典非常有用

  • 这有点不好,因为如果你在相同版本的python上以相同的顺序加载字典,你几乎肯定会获得相同的项目. (25认同)
  • python 3.6 dict实际上是*ORDERED*!这非常重要 (20认同)
  • 这个答案是错的.即使在3.6之前,这也不会给你一个随机值,而是一个值取决于项目的哈希值. (3认同)
  • 这是狡猾和坏,它不是pythonic (2认同)
  • 忽略与 OP 请求的不一致,这种方式是克服`next` 不适用于字典的事实的好方法,因为它是一个映射。(我来这里是为了灵感,就是这样)。 (2认同)

lav*_*ngh 11

试试这个:

import random
a = dict(....) # a is some dictionary
random_key = random.sample(a, 1)[0]
Run Code Online (Sandbox Code Playgroud)

这绝对有效.

  • 然而,“random_key = random.sample(a.keys(), 1)[0]”确实有效。 (4认同)
  • `类型错误:总体必须是序列或集合。对于字典,请使用 list(d)。` (3认同)

use*_*312 9

>>> import random
>>> d = dict(Venezuela = 1, Spain = 2, USA = 3, Italy = 4)
>>> random.choice(d.keys())
'Venezuela'
>>> random.choice(d.keys())
'USA'
Run Code Online (Sandbox Code Playgroud)

通过在字典(国家)上调用random.choicekeys.

  • @beepretty dict.keys()返回一个可迭代对象,而不是类似列表的对象.要解决该错误,请使用`random.choice(list(d.keys()))`. (5认同)
  • 使用 random.sample 代替,这比将密钥复制到列表便宜。 (3认同)
  • 嗨,我尝试使用您的方法从给定的词典中随机选择一个键,但是它不起作用。我的字典看起来像一个= {'walk':20,'run':80},当我使用random.choice(a.keys())时,出现类似“ dict_keys对象不支持索引”的错误。你知道怎么了吗 非常感谢!!! (2认同)

fir*_*ynx 8

这适用于 Python 2 和 Python 3:

随机密钥:

random.choice(list(d.keys()))
Run Code Online (Sandbox Code Playgroud)

一个随机值

random.choice(list(d.values()))
Run Code Online (Sandbox Code Playgroud)

随机键和值

random.choice(list(d.items()))
Run Code Online (Sandbox Code Playgroud)


OBu*_*OBu 5

由于最初的帖子想要这

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

(Python 3风格)