【问题标题】:How to use list comprehension in list derived class如何在列表派生类中使用列表推导
【发布时间】:2020-04-18 19:01:21
【问题描述】:

我有一个列表派生类,并希望使用列表推导来分配其内容 这是示例代码:

class MyList(list):
    def __init__(self, some_data):
        self = [Foo(x) for x in some_data]

    def customFilter(self):
        self = [x for x in self if x.Selected]

当然这不起作用,因为对 self 的赋值只是创建了一个局部变量。 有没有不使用for循环的pythonic方法来实现这一点?

【问题讨论】:

  • 为什么需要从list派生?
  • 主要原因是添加一些额外的方法,即扩展列表功能
  • 推导的目的肯定是为了复用?
  • 我在代码中添加了自定义方法来说明为什么我从列表中派生
  • @JuliusG 你在重新定义自我吗?我很困惑。

标签: python constructor list-comprehension derived-class


【解决方案1】:

使用Collections.UserList 可能更好,它是为子类化而设计的。它为您提供了一个 data 属性,该属性包含列表内容并避免分配给 self 的问题:

from collections import UserList

def Foo(c):
    return c * 2

class MyList(UserList):
    def __init__(self, some_data):
        self.data = [Foo(x) for x in some_data]

MyList([1, 2, 3])
# [2, 4, 6]

【讨论】:

  • self.extend(Foo(x) for x in some_data) 的性能会稍好一些,因为您不会创建中间列表
【解决方案2】:

为什么不调用list的初始化器?

list.__init__(self, (Foo(x) for x in some_data))

甚至,你为什么需要另一个课程?

def create_foos(some_data):
    return [Foo(x) for x in some_data]

list(map(Foo, some_data))

【讨论】:

    猜你喜欢
    • 2010-10-29
    • 1970-01-01
    • 2019-12-29
    • 1970-01-01
    • 2017-12-23
    • 1970-01-01
    • 2013-04-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多