在List子类的方法中切换`self`的正确方法是什么?

时间:2018-04-18 21:53:14

标签: python list slice

我打算创建一个切片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

我在上述伪代码中尝试表达的正确方法是什么?

1 个答案:

答案 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: []