Python列表操作

5

这是我拥有的代码,但看起来不像是Python。

def __contains__(self, childName):
    """Determines if item is a child of this item"""
    for c in self.children:
        if c.name == childName:
            return True
    return False

怎样是最“Python”的方式来完成这个任务?使用lambda过滤函数吗?很少有在线示例实际使用对象列表进行属性比较,它们总是展示如何使用实际字符串列表完成,但这并不太现实。


1
你的代码相当自解释。对它感到满意,然后转向下一个问题 :) - jkj
3个回答

7
我会使用:

我会使用:

return any(childName == c.name for c in self.children)

这段代码很短,和你的代码一样有一个优点,就是它会在找到第一个匹配项时停止。

如果您经常这样做,并且速度是一个问题,您可以创建一个新属性,其中包含子名称的集合,然后只需使用return childName in self.childNames,但是您必须更新更改子项的方法以使childNames保持最新状态。


1
我正在寻找any()。但我仍然认为Python将其作为全局函数是愚蠢的。 - asdasdasd
  1. 我希望你能使用其他词语来表达你的不满,而不是使用“弱智”这个词。
  2. 除了全局函数,它应该是什么?
- Ned Batchelder
一个列表的函数。mylist.any(expr) - asdasdasd
1
这里没有列表:any() 中的表达式是一个生成器表达式。any() 函数可以接受任何迭代器作为参数,因此没有共同的基类可以容纳方法。 - Ned Batchelder
好的,那么这更深入地涉及到我对一些Python选择的不同意见。迭代器应该是一个具有任何方法的类。 - asdasdasd
@asdasdasd:听起来像是静态类型的思维方式,即对象最重要的是它的“本质”。Python 的动态类型使用了不同的哲学,即对象最重要的是它的“行为”。因此,并不存在所有迭代器的共同基类。 - Ned Batchelder

5

我会这样做:

return childName in [c.name for c in self.children]

5
这种方法的不足之处在于需要遍历 self.children,并创建一个中间列表。 - Ned Batchelder
这正是我想知道的。你的解决方案消除了问题:任何(childName == c.name for c in self.children)。 - Gabriel Ross

1

使用lambda的一种方法:

from itertools import imap
return any(imap(lambda c: c.name == childName, self.children))

但是对我来说,原始解决方案似乎更清晰。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接