2012-10-20 143 views
0

是否有一種比較對象的字符串表示形式與列表中的每個對象的簡單方法?比較對象的字符串表示形式與列表中每個對象的字符串表示形式

下面的示例代碼(Python 2.7)按預期工作,但我認爲在Python中執行此操作有更好的方法!

class url(object): 
    def __init__(self, address): 
     self.address = address 

    def __str__(self): 
     return self.address 

list_of_urls = [url('http://www.example.foo'), url('http://www.example.bar')] 
test_url = url('http://www.example.foobar') 

test_url_listed = False 
for link in list_of_urls: 
    if str(test_url) == str(link): 
     test_url_listed = True 

if not test_url_listed: 
    list_of_urls.append(test_url) 

是否有可能在結構上更接近於以下內容?

if test_url not in list_of_urls: 
    list_of_urls.append(test_url) 

(由於是,這種失敗,因爲它比較的對象,而不是它們所代表的字符串。)

回答

1
if str(test_url) not in [str(url) for url in list_of_urls] 

或者更好的是,實現對URL類__cmp__和/或__eq__ + __ne__。 (也可能爲__hash__。)然後,您可以創建一個set網址,它可以自動確保沒有重複的網址。

+0

我在考慮如何在類中實現它,這個解決方案的後半部分就是如此。讓我的代碼使用'__eq__'工作。 –

1

最快的方法是實施__cmp__方法。

class url(object): 
    def __init__(self, address): 
     self.address = address 

    def __str__(self): 
     return self.address 

    def __cmp__(self, other): 
     return cmp(self.address, other.address) 


list_of_urls = [url('http://www.example.foo'), url('http://www.example.bar')] 
test_url = url('http://www.example.foobar') 

這: 「在沒有」

if test_url not in list_of_urls: 
    print("Not in") 

打印。

或者,您可以使用「豐富」的比較,但這是多一點努力。類方法可以提供幫助。

from functools import total_ordering 

@total_ordering 
class url(object): 
    def __init__(self, address): 
     self.address = address 

    def __str__(self): 
     return self.address 

    def __eq__(self, other): 
     return self.address == other.address 

    def __lt__(self, other): 
     return self.address < other.address 

這使得所有的比較都可以使用名爲「address」的字符串屬性。但是,如果您比較其他對象,則這將失敗。

+0

'__cmp__'已過時,並可在[Python 3](http://docs.python.org/py3k/whatsnew/3.0.html#ordering-comparisons)中使用。在3.2+'functools.total_ordering'中是一個簡單的方法來免費獲得所有的比較。在以前的版本中,每個版本仍然只有一個版本(如果只需要平等和不平等,則只有一個版本)。 – delnan

+0

@delnan真的。通過添加該替代方法進行編輯。 – Keith

相關問題