[英]Is there a built-in container which maps int -> element?
我需要一个与标准dict
非常相似的东西,该dict
用于将整数(范围从0到数百)映射到任意元素:
d = {}
d[5] = "hello"
d[100] = "world"
d[70] = "pretty"
不幸的是,我需要非常频繁地(读)访问d
, dict
变得很慢。 另外,我还需要保留元素的顺序以及通过该顺序访问元素的方法。 例如:
>>> d.order_at(0)
hello
>>> d.order_at(2)
pretty
我给自己写了一个类似dict的容器,它比dict
快得多,因为它在内部使用了一个list
并使用键作为索引:
class IntDict:
def __init__(self):
self._by_key = []
self._by_index = []
def __contains__(self, int_key):
return int_key < len(self._by_key) and self._by_key[int_key] is not None
def __getitem__(self, int_key):
return self._by_key[int_key]
def __len__(self):
return len(self._by_index)
def __setitem__(self, int_key, value):
assert value is not None
self._by_key += [None] * (int_key - len(self._by_key) + 1)
if self._by_key[int_key] is None:
self._by_index.append(int_key)
self._by_key[int_key] = value
def order_at(self, index):
return (self._by_key[self._by_index[index]]
if index < len(self._by_index) else None)
但这有一些明显的缺点:
d[100000] = 1
会导致列表100000
None
s (bool, <element)
元组,以便知道某个元素是否已设置为None
或尚未设置( _by_index
列表需要) 所以我想知道是否已经有一个实现可以神奇地解决我的问题的实现。
Python的默认dict
实现确实非常快。 但是,如果您想轻松地从字典访问第n'th element
,我建议您使用OrderedDict
。 从python 3.7开始, dict
保留插入顺序,因此您可以只使用标准dict
>>> from collections import OrderedDict
>>> d=OrderedDict()
>>> d[5] = "hello"
>>> d[100] = "world"
>>> d[70] = "pretty"
>>>
对于python 2.7
>>> d.items()[2]
(70, 'pretty')
对于python 3.x
>>> n = 2
>>> list(d.items())[n]
(70, 'pretty')
将dict的项目转换为列表可能需要大量内存,并且当dict大且没有足够的内存时可能会很慢。 所以更好的方法是使用next
和islice
>>> from itertools import islice
>>> n = 2
>>> next(islice(d.items(), n, n+1))
(70, 'pretty')
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.