繁体   English   中英

是否有一个映射int-> element的内置容器?

[英]Is there a built-in container which maps int -> element?

我需要一个与标准dict非常相似的东西,该dict用于将整数(范围从0到数百)映射到任意元素:

d = {}
d[5] = "hello"
d[100] = "world"
d[70] = "pretty"

不幸的是,我需要非常频繁地(读)访问ddict变得很慢。 另外,我还需要保留元素的顺序以及通过该顺序访问元素的方法。 例如:

>>> 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大且没有足够的内存时可能会很慢。 所以更好的方法是使用nextislice

>>> from itertools import islice
>>> n = 2
>>> next(islice(d.items(), n, n+1))
(70, 'pretty')

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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