问题的简短版本:
当比较键是范围(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(即使在大多数情况下绝大多数条目都不会被使用)之间做出选择? 或者正如我上面所说的,在使用这种结构时,我应该在两者之间选择哪些细节?(比如“如果你用你的对象做了很多事情,那么字典就更好了”)
(将仅尝试解决一般的“列表与目录”部分。
对此持保留态度;从用户而不是实施者那里。
这不是一个真正的答案,更像是一个大评论。)
列表(可能是双链接列表)应提供高效的 插入和;在任何地方删除(仅修改指向
的指针 下一个/上一个元素,O(1))。
搜索将无效(O(n)-检查所有项目-,
和缓存未命中*-引用位置错误-。
(*vs连续存储在内存中的项(例如numpy.数组))
Dict(某种哈希映射)理论上应该提供
高效的搜索、插入&;删除(摊销O(1))
但这可能取决于哈希函数的质量,
桶大小、使用模式等(我知道的还不够)
按顺序遍历所有项目将效率低下
对于这两种情况,由于缓存未命中/引用的位置不正确
(遵循指针,而不是按顺序访问内存)
据我所知:
您可以使用列表作为可变序列(需要时
在Python中迭代所有项),因为缺少更好的
可选(C数组,C++ STD::数组/STD::向量/等)。 您可以使用dicts基于键进行快速查找/搜索,
当搜索比插入/删除更重要/更频繁时
相关问题 更多 >
编程相关推荐