我打算创建一个切片list
的方法,但是我没有正确的语法,而且我还没有找到正确的搜索查询来查找如何做到这一点:
class BarList(list):
"""Items in the list are always in ascending order of .date"""
def trim(self, start:dt.datetime=None, end:dt.datetime=None):
"""Removes all bars before `start` and after `end`"""
if start:
for i, bar in enumerate(self):
if bar.date >= start:
self = self[i:]
break
我在上述伪代码中尝试表达的正确方法是什么?
答案 0 :(得分:1)
self = self[i:]
不正确的原因是因为它所做的就是对列表进行切片并将该切片分配给名为self
的局部变量。它实际上并没有修改列表。
要更改列表内容,您可以使用slice assignment:
self[:] = self[i:]
这基本上意味着"用=
符号"右侧的值替换列表的整个内容。
问题的另一部分是让您的trim
方法正常工作。在某些情况下,您的代码无法处理。这是更新后的代码:
import datetime as dt
class BarList(list):
"""Items in the list are always in ascending order of .date"""
def trim(self, start:dt.datetime=None, end:dt.datetime=None):
"""Removes all bars before `start` and after `end`"""
if start:
for i, bar in enumerate(self):
if bar >= start:
# if this date is later than `start`, remove
# everything up to here
self[:] = self[i:]
break
else:
# if no date greater than `start` was
# found, delete everything
del self[:]
试运行:
l = BarList([dt.datetime.now()])
print(l) # output: [datetime.datetime(2018, 4, 19, 0, 18, 14, 23474)]
l.trim(dt.datetime.now())
print(l) # output: []