pythonic方式过滤列表派生类?

时间:2017-03-02 07:43:36

标签: python list

这是伪代码:

class Foo (list):
    def methods...

foo=Foo()
foo.readin()

rule='....'
bar=[for x in foo if x.match(rule)]

这里,bar是一个列表,但我希望它是Foo的一个实例,我知道的唯一方法是创建一个for循环并逐个追加项目:

bar=Foo()

for item in foo:
    if item.match(rule):
        bar.append(item)

所以我想知道是否有更简洁的方法或更多的pythonic方法来做到这一点?

2 个答案:

答案 0 :(得分:4)

您可以将generator expression传递给Foo()来电:

bar = Foo(x for x in foo if x.match(rule))

(当将生成器表达式传递给调用时,它是唯一的参数,您可以删除通常放在生成器表达式周围的括号)。

答案 1 :(得分:-1)

似乎另一个答案被删除了,因为原来的回答者删除了它。所以我在这里发布另一种方式来完成。如果原始回答者恢复了他的答案,我将自己删除这个答案。

另一种方法是使用build in filter函数。代码是:

bar=filter( lambda x: x.match(rule) , foo )

我想为什么原来的答案家伙删除了他的答案,因为据说这是一个不鼓励使用过滤功能。在问这个问题之前,我做了一些研究。但我想我从那个答案中学到了很多东西。因为我自己试图使用过滤功能,但从未弄清楚如何正确使用它。所以这个答案告诉我如何正确阅读手册,无论如何,它仍然是解决我的问题的有效方法。所以在这里,如果原始的回答者可以看到我的帖子,谢谢你,我感谢你的帮助,这肯定帮助了我。

更新:    正如Martijn在评论中所说的那样,这不是一个有效的答案。我会保持这个因为这个谈话很好。但这不是解决我问题的有效方法。