在没有迭代的情况下在字典中任意选择一个键

时间:2016-06-21 10:56:39

标签: python dictionary

我只是想确保在Python词典中没有办法只获得一个键(没有特定的质量或与某个值的关系),而是进行迭代。就像我发现的那样,你必须通过循环遍历整个字典来列出它们。像这样:

list_keys=[k for k in dic.keys()]

问题是,如果字典不是空的话,我只需要一个任意键,而不关心其余部分。我想迭代一个长字典除了创建一个长列表,只是随机获取一个密钥是一个很大的开销,不是吗? 是否有人可以指出更好的技巧?

由于

5 个答案:

答案 0 :(得分:2)

您可以使用random.choice

rand_key = random.choice(dict.keys())

这只适用于python 2.x,在python 3.x中,dict.keys返回一个迭代器,所以你必须将它转换成一个列表 -

rand_key = random.choice(list(dict.keys()))

所以,例如 -

import random
d = {'rand1':'hey there', 'rand2':'you love python, I know!', 'rand3' : 'python has a method for everything!'}
random.choice(list(d.keys()))

输出 -

rand1

答案 1 :(得分:2)

这里的很多答案产生了一个随机键,但原始问题要求任意键。这两者之间存在很大差异。随机性有一些数学/统计保证。

Python字典没有以任何有意义的方式排序。所以,是的,访问任意键需要迭代。但是对于单个任意键,我们不需要迭代整个字典。内置函数nextiter在这里非常有用:

key = next(iter(mapping))

内置iter会在映射中的键上创建一个迭代器。迭代顺序是任意的。 next内置函数返回迭代器中的第一个项。对于任意键,不需要迭代整个映射。

如果您最终要从映射中删除密钥,则可以使用dict.popitem。这是docstring:

D.popitem() -> (k, v), remove and return some (key, value) pair as a 2-tuple;
but raise KeyError if D is empty.

答案 2 :(得分:1)

你是对的:没有办法在不使用迭代的情况下从普通dict获取随机密钥。甚至像random.choice这样的解决方案也必须在后台迭代字典。

但是你可以使用排序的词典:

from sortedcontainers import SortedDict as sd

d = sd(dic)
i = random.randrange(len(d))
ran_key = d.iloc[i]

更多信息:。

http://www.grantjenks.com/docs/sortedcontainers/sorteddict.html

请注意,使用SortedDict之类的内容是否会导致任何效率提升将完全取决于实际实施。如果您正在创建大量SD对象,或经常添加新密钥(必须进行排序),并且偶尔只获得与其他两个任务相关的随机密钥,则您不太可能看到很多性能提升。

答案 3 :(得分:0)

这样的事情怎么样:

import random
arbitrary_key = random.choice( dic.keys() )
顺便说一下,你对列表理解的使用确实毫无意义:

dic.keys() == [k for k in dic.keys()]

答案 4 :(得分:-4)

检查这样的词典长度,这应该做!!

import random

if len(yourdict) > 0:
    randomKey = random.sample(yourdict,1)
    print randomKey[0]
else:
    do something

randomKey将返回一个列表,因为我们已经传递1,所以它将返回带有1个键的列表,然后使用randomKey [0]

获取密钥