如何从字典中获取随机值?

1cklez4t  于 2021-07-13  发布在  Java
关注(0)|答案(17)|浏览(452)

我怎样才能从一个 dict ? 我在做一个游戏,你需要猜一个国家的首都,我需要问题随机出现。
这个 dict 看起来像 {'VENEZUELA':'CARACAS'} 我该怎么做?

bkkx9g8r

bkkx9g8r1#

一种方法是:

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

编辑:这个问题在最初的帖子发布几年后被修改了,现在要求的是一对,而不是一个项目。最后一行现在应该是:

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

ercv8c1e2#

我写这篇文章是为了解决同样的问题:
https://github.com/robtandy/randomdict
它有o(1)个对键、值和项的随机访问权限。

hpcdzsge

hpcdzsge3#

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

通过在 keys (国家)词典。

xytpbqjk

xytpbqjk4#

试试这个:

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

这绝对管用。

rsl1atfo

rsl1atfo5#

如果你不想使用 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 从字典中删除键值对,如文档中所述。
popitem()用于对字典进行破坏性迭代

jdzmm42g

jdzmm42g6#

这适用于python 2和python 3:
随机键:

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

随机值

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

随机键和值

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

liwlm1x97#

因为最初的帖子想要这对:

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

(python 3样式)

z18hc3ub

z18hc3ub8#

如果不想使用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'
sdnqo3pr

sdnqo3pr9#

既然这是家庭作业:
退房 random.sample() 它将从列表中选择并返回一个随机元素。您可以使用 dict.keys() 以及一个字典值列表 dict.values() .

ehxuflar

ehxuflar10#

我想你是在申请测验。对于这种应用,我编写了一个函数,如下所示:

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) 然后输出如下:

VENEZUELA? CARACAS
CANADA? TORONTO

您还可以通过洗牌选项来进一步扩展它

o2gm4chl

o2gm4chl11#

对于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}')

参考文献:

  • python3.8:标准库文档-内置类型:dictionary视图对象

python 3.8:数据结构-列表理解:

2nbm6dog

2nbm6dog12#

试试这个(使用random.choice from items)

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'
icnyk63a

icnyk63a13#

下面是一个字典类的小python代码,它可以在o(1)时间内返回随机键(为了便于阅读,我在代码中加入了mypy类型):

from typing import TypeVar, Generic, Dict, List
import random

K = TypeVar('K')
V = TypeVar('V')
class IndexableDict(Generic[K, V]):
    def __init__(self) -> None:
        self.keys: List[K] = []
        self.vals: List[V] = []
        self.dict: Dict[K, int] = {}

    def __getitem__(self, key: K) -> V:
        return self.vals[self.dict[key]]

    def __setitem__(self, key: K, val: V) -> None:
        if key in self.dict:
            index = self.dict[key]
            self.vals[index] = val
        else:
            self.dict[key] = len(self.keys)
            self.keys.append(key)
            self.vals.append(val)

    def __contains__(self, key: K) -> bool:
        return key in self.dict

    def __len__(self) -> int:
        return len(self.keys)

    def random_key(self) -> K:
        return self.keys[random.randrange(len(self.keys))]
vawmfj5a

vawmfj5a14#

从字典集中选择50个随机键值 dict_data :

sample = random.sample(set(dict_data.keys()), 50)
omqzjyyz

omqzjyyz15#

一种方法是:

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

编辑:这个问题在最初的帖子发布几年后被修改了,现在要求的是一对,而不是一个项目。最后一行现在应该是:

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

相关问题