2013-10-04 112 views
0

我有一個對象列表中,我在尋找,如果我的搜索屬性title比賽搜索包含對象屬性和打印/返回對象的Python

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

回答

0

通常,我會先創建一個過濾器,以獲取符合條件的項目。然後我會遍歷說,做任何你想做的事情:

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

這裏的好處是,你做的過濾的時間提前(不filter),你只能做篩選測試一次。

+0

你們對我的發電機對象是非常有用的。既然你把它放在'()'中,你已經使它成爲一個非迭代對象。但是,如果我把它放在'[]'中,會改變發生器對象的功能嗎?它表明它在我身邊工作,所以'()'和'[]'之間有什麼區別嗎? – lzc

+0

一個生成器只能搜索一個對象的屬性嗎?假設我還想搜索'Something.anotherAttr'或'AnotherObj.title',爲此我需要創建另一個生成器對象。 – lzc

+0

@czl - 關於你的第一個問題,'(... for ... in ...)'是一個生成器表達式。 '[... for ... in ...]'是一個列表理解。第一個創建一個可以迭代的對象,而不是其他的。第二個創建一個「列表」。首先是內存有效率,因爲它不存儲值 - 它只是在需要時計算它們。第二個很好,因爲在一天結束時,你有一個易於使用的清單。 – mgilson

0

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

你可以這樣做:

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

是的,可以做。這種方法我使用更多的「Pythonic」? – lzc

+0

@ user2836917我在這裏看不到'any()'的需要。你可以做'map(filter(lambda x:search in str(x.title),something))'或者列表理解(我會這樣做):'[str(i)for i in something in something if search in STR(x.title)]' – TerryA