【问题标题】:Search list that contain object attribute and print/return object Python包含对象属性和打印/返回对象 Python 的搜索列表
【发布时间】:2013-10-04 03:22:31
【问题描述】:

如果 title 属性与我的搜索匹配,我将在其中搜索一个对象

class Something(object):
    def __init__(self,title):
        self.title = title

    def __str__(self):
        return "%s is the title " % self.title

如何在对象被调用时打印它?这就是我搜索它的方式。

search = " ".join(s[1:]).lower()
if any(search in str(a.title).lower() for a in something):
    print filter(lambda x: search in str(x.title),something)

If any(...) 将检查搜索的任何部分是否与我的对象的标题匹配,如果找到任何内容将返回 true。


filter(...) 打印对象,但这是我遇到问题的地方它打印:


[<__main__.Something object at 0x0000000002C93B38>, <__main__.Something object at 0x0000000002D33828>]


我知道这是一个对象,为什么不通过__str__(self)方法打印?如何从我的对象Something 中调用打印功能?

【问题讨论】:

    标签: python search object filter lambda


    【解决方案1】:

    一般来说,我会先创建一个过滤器来获取符合您条件的项目。然后我会遍历它并做任何你想做的事情:

    generator = (x for x in something if search in str(x.title).lower())
    for item in generator:
       print item
    

    这里的好处是你提前做了过滤(没有filter),你只做一次过滤测试。

    【讨论】:

    • 您向我展示的生成器对象非常有用。由于您将它包含在() 中,因此您已将其设为非迭代对象。但是如果我将它包含在[] 中,那会改变生成器对象的功能吗?它表明它对我有用,那么()[]之间有什么区别吗?
    • 一个生成器只能搜索一个对象的属性吗?假设我还想搜索Something.anotherAttrAnotherObj.title,为此我需要创建另一个生成器对象对吗?
    • @czl -- 关于你的第一个问题,(... for ... in ...) 是一个生成器表达式。 [... for ... in ...] 是一个列表理解。第一个创建了一个可以迭代的对象,仅此而已。第二个创建一个list。第一个是内存效率高,因为它不存储值——它只在需要时计算它们。第二个很好,因为在一天结束时,您有一个易于使用的列表。
    【解决方案2】:

    您正在打印 列表 的字符串表示形式,而不是列表中的每个项目。

    你可以这样做:

    print map(str, filter(lambda x: search in str(x.title),something))
    

    【讨论】:

    • 可以的。这种方法我使用的是更多“Pythonic”吗?
    • @user2836917 我认为这里不需要any()。您可以只做map(filter(lambda x: search in str(x.title), something)) 或作为列表理解(我会这样做):[str(i) for i in something if search in str(x.title)]
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-08
    • 2015-11-05
    • 2016-04-16
    • 1970-01-01
    • 2014-03-15
    • 2019-01-04
    • 1970-01-01
    相关资源
    最近更新 更多