繁体   English   中英

Python 3.x中的采样字典

[英]Sampling dictionaries in Python 3.x

在Python 3中, dict_valuesdict_keysdict_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或任何其他非迭代迭代的索引。

*关于记录什么行为的实际规则已经更改了几次。 当前版本实际上说:“它们提供了字典条目的动态视图,这意味着当字典发生更改时,视图会反映这些更改”,这意味着现在可以依靠实际规则了。 但是,即使您使用的是旧版本,例如,明确地仅保证对keysvaluesitems和相关函数的相邻调用之间的一致性,除非您担心有人在编写新的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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM