Python3.x中的采样字典

2024-04-19 01:42:38 发布

您现在位置:Python中文网/ 问答频道 /正文

在python3中,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方法?(我还可以想象,将它们转换为一个列表将创建一个副本,这对于大型词典可能不太管用)。你知道吗


Tags: 方法数据结构内容列表字典my副本items
2条回答

如果您只想要一个键、值或项,请使用next()iter()

next(iter(my_dict))
next(iter(my_dict.values()))
next(iter(my_dict.items()))

Sometimes I just want to get a random sample of what's in my dictionary. I know I can convert them their output to lists. Do they have any other getter methods that do not require creating another data structure? (I would also imagine that converting them to a list would create a copy, which may not work well for huge dictionaries).

键类型在Dictionary view objects下解释,也保证是^{}和friends的子类。基本上,这意味着您只能指望它们具有__contains____iter____len__。你知道吗

它们不直接支持索引,因为它们的顺序可能会失效。*但实际上,在Python的任何实现中,它们实际上只有在对字典进行变异时才会失效。这意味着你可以安全地做这样的事情:

next(itertools.islice(my_dict.keys(), i, None))

基本上,与索引set或任何其他非迭代器iterable的方法相同。你知道吗

*关于记录哪些行为的实际规则已经改变了几次。目前的版本实际上是这样说的:“它们提供了字典条目的动态视图,这意味着当字典发生变化时,视图会反映这些变化”,这意味着现在可以依赖实用规则。但是,即使您使用的是一个旧版本,例如,显式地只保证对keysvaluesitems和相关函数的相邻调用之间的一致性,除非您担心有人编写python2.6或3.1或其他什么的新实现,否则没有理由担心这个问题。


当然,您可能希望将其封装在一个更可读的函数中。事实上,我会分两步来做。首先,使用^{} recipes中的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)))

相关问题 更多 >