从非空的defaultdict中挑选一个随机元素

时间:2016-08-10 08:33:43

标签: python python-3.x defaultdict

我说:

import collections, random
d = collections.defaultdict(list)
d['foo'].append('bar')

然后我选择一个随机元素:

random.choice(d)

现在让我们打印d

defaultdict(list, {0: [], 'foo': ['bar']})

为什么random.choice添加0作为密钥?

2 个答案:

答案 0 :(得分:6)

在内部,这是random.choice的作用:

def choice(self, seq):
    """Choose a random element from a non-empty sequence."""
    return seq[int(self.random() * len(seq))]

在你的情况下,长度为1,在乘法后,它会产生范围[0.0, 1.0)中的数字,并且在应用int()后,你将得到0。

请注意defaultdict会在其上访问的dict中添加任意键:

>>> d = collections.defaultdict(list)
>>> d['i dont exist']
[]
>>> d
defaultdict(<type 'list'>, {'i dont exist': []})

因此,你的词典以0结束。

答案 1 :(得分:1)

我认为行为实际上是 undefined ,因为根据文件(强调我的):

  

random.choice(seq)

     

从非空中返回一个随机元素   序列 seq。如果seq为空,则引发IndexError。

seq需要是序列类型,例如listtuplerange。但是,defaultdict是内置dict类的子类,因此它是映射类型。

由于序列类型只能将整数作为“键”,因此random.choice查找d[x]为什么xrange(0, len(d))中的整数并不奇怪。