[英]Sampling dictionaries in Python 3.x
在Python 3中, dict_values
, dict_keys
和dict_items
不支持索引
my_dict = {'a': 0', 'b': 1', 'c': 2}
以下所有查询均失败:
my_dict.keys()[1]
my_dict.values()[1]
my_dict.items()[1]
是因为。
有时我只是想随机获取字典中的内容。 我知道我可以将它们的输出转换为列表。 他们还有其他不需要创建其他数据结构的getter方法吗? (我也可以想象将它们转换为列表会创建一个副本,这对于庞大的词典可能效果不佳)。
有时我只是想随机获取字典中的内容。 我知道我可以将它们的输出转换为列表。 他们还有其他不需要创建其他数据结构的getter方法吗? (我也可以想象将它们转换为列表会创建一个副本,这对于庞大的词典可能效果不佳)。
键类型在Dictionary视图对象下进行了说明,并且也保证是collections.abc.KeysView
和friends的子类。 基本上,这意味着您只能指望它们具有__contains__
__iter__
, __iter__
和__len__
。
它们不直接支持索引,因为它们的排序可能会无效。*但是实际上,在任何Python实现中,只有在您对字典进行了更改时,它们实际上才是无效的。 这意味着您可以安全地执行以下操作:
next(itertools.islice(my_dict.keys(), i, None))
基本上,您可以为set
或任何其他非迭代迭代的索引。
*关于记录什么行为的实际规则已经更改了几次。 当前版本实际上说:“它们提供了字典条目的动态视图,这意味着当字典发生更改时,视图会反映这些更改”,这意味着现在可以依靠实际规则了。 但是,即使您使用的是旧版本,例如,明确地仅保证对keys
, values
, items
和相关函数的相邻调用之间的一致性,除非您担心有人在编写新的Python 2.6或3.1的实现, ,没有理由担心。
当然,您可能希望将其包装在更具可读性的函数中。 实际上,我将分两步进行。 首先,使用itertools
配方中的nth
函数:
def nth(iterable, n, default=None):
return next(itertools.islice(iterable, n, None), default)
然后包装关键索引:
def getkey(mapping, index, default=None):
return nth(mapping.keys(), index, default)
如果要随机抽样怎么办? 好吧,字典视图和字典本身都是Sized
,因此您可以随时使用randrange
:
def choosekey(mapping):
return getkey(mapping, random.randrange(len(mapping)))
如果你只是想一个键,值或项,请使用next()
和iter()
next(iter(my_dict))
next(iter(my_dict.values()))
next(iter(my_dict.items()))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.