如何在具有范围(n)内的整数键的字典和长度为n的列表之间进行选择?

2024-10-02 08:24:14 发布

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

问题的简短版本:

当比较键是范围(n)内整数的字典和长度为n的列表时,实现的关键点是选择一个还是另一个?比如“如果你用你的对象做了很多事情,那么字典就更好了”

问题的详细版本

我不确定我的以下实施细节是否与问题有关。。。就是这样。 为了使我的代码更具python风格,我实现了UserList的一个子类,它接受一个整数和一个表示基l中整数的列表作为索引

from collections import UserList

class MyList(UserList):
    """
    A list that can be accessed both by a g-tuple of coefficients in range(l)
    or the corresponding integer.
    """
    def __init__(self, data=None, l=2, g=None):
        self.l = l
        if data == None:
            if g == None:
                raise ValueError
            self.data = [0]*(l**g)
        else:
            self.data = data
        
    def __setitem__(self, key, value):
        if isinstance(key, int):
            self.data[key] = value
        else:
            self.data[self.idx(key)] = value

    def __getitem__(self, key):
        if isinstance(key, int):
            return self.data[key]
        return self.data[self.idx(key)]

    def idx(self, key):
        l = self.l
        idx = 0
        for i, value in enumerate(key):
            idx += value*l**i
        return idx

可以这样使用:

L = MyList(l=4, g=2) #creates a list of length 4**2 initialized at zero
L[9] = 'Hello World'
L[9] == L[1,2]

我已经对这个类进行了泛化,将l作为一个基元组(让我们称这个泛化类为MyListTuple),但是代码是用SageMath编写的,所以我不想将其转换为纯python,但它工作得很好

它看起来像这样:

L = MyListTuple(l=[2,4], g=2) #creates a list of length 2^2*4^2 initialized at zero
L[0,9] = 'Hello World'
L[0,9] == L[[0,0],[1,2]]

我想改进的下一部分是我目前使用的一个字典,其中的键是整数的元组(因此您可以作为d[9,13,0]访问它),但我也希望能够使用作为(等效)键列表,表示上面的基数l中的整数(因此对于l=4,将是d[[1,2], [1,3], [0,0]]

这与我在MyListTuple中所做的非常相似,但在本例中,很多键从未使用过

所以我的问题是:如何在创建UserDict的子类(在处理给定键时相当于MyListTuple)和只使用MyListTuple(即使在大多数情况下绝大多数条目都不会被使用)之间做出选择? 或者正如我上面所说的,在使用这种结构时,我应该在两者之间选择哪些细节?(比如“如果你用你的对象做了很多事情,那么字典就更好了”)


Tags: ofkeyselfnone列表dataif字典
1条回答
网友
1楼 · 发布于 2024-10-02 08:24:14

(将仅尝试解决一般的“列表与目录”部分。
对此持保留态度;从用户而不是实施者那里。
这不是一个真正的答案,更像是一个大评论。)

列表(可能是双链接列表)应提供高效的 插入和;在任何地方删除(仅修改指向
的指针 下一个/上一个元素,O(1))。
搜索将无效(O(n)-检查所有项目-,
和缓存未命中*-引用位置错误-。
(*vs连续存储在内存中的项(例如numpy.数组))

Dict(某种哈希映射)理论上应该提供
高效的搜索、插入&;删除(摊销O(1))
但这可能取决于哈希函数的质量,
桶大小、使用模式等(我知道的还不够)

按顺序遍历所有项目将效率低下
对于这两种情况,由于缓存未命中/引用的位置不正确
(遵循指针,而不是按顺序访问内存)

据我所知:
您可以使用列表作为可变序列(需要时
在Python中迭代所有项),因为缺少更好的
可选(C数组,C++ STD::数组/STD::向量/等)。 您可以使用dicts基于键进行快速查找/搜索,
当搜索比插入/删除更重要/更频繁时

相关问题 更多 >

    热门问题