【发布时间】:2021-03-03 04:04:48
【问题描述】:
高级问题: 比如说,你创建了一个类,它的作用类似于一个列表,但可以快速搜索一个元素,即一个同时为其内容元素编制索引的列表,因此查找特定元素的索引是 O(1),而不是 O(n ),就像在标准列表中一样。那么接下来怎么做呢?
class Fast_List():
def __init__(self):
self._list = []
self._index = {}
def __getitem__(self, idx):
return self._list[idx]
def __call__(self, idx):
return self._list[idx]
def append(self, elem):
idx = len(self._list)
self._list.append(elem)
self._index[elem] = idx
def index(self, elem):
return self._index[elem]
al = Fast_List()
al = [i**2 for i in range(1000)]
上述代码的最后一行将创建一个由连续整数平方组成的常规列表,而不是 Fast_list。
但如果我希望它返回理解语句的 Fast_List 版本怎么办
(当然,我在上面的课程中遗漏了一些函数定义,但它不应该影响我提出的问题
现在,当然,我知道我可以简单地使用 for 循环来构建我的 Fast_List
al = Fast_List()
for i in range(1000):
al.append(i**2)
...但我喜欢理解机制,我想知道它是否可以用于创建用户定义的类对象
【问题讨论】:
-
没有办法让列表推导不评估为列表。这就是构造的作用
-
@juanpa.arrivillaga 这是一个不计算为列表的列表推导:
[1/x for x in range(666)]。 -
@superbrain 在构建列表时遇到错误仍在构建列表。
-
@rdas 我同意“construct”但不同意“evaluate”。
-
@superbrain 也许“如果它没有错误地完成,总是评估一个列表”会更准确,但在这一点上这是分裂的头发。无论哪种方式,这对手头的讨论都没有帮助。
标签: python list overloading list-comprehension