2012-10-20 8 views
0

개체의 문자열 표현을 목록의 각 개체와 비교하는 간단한 방법이 있습니까?개체의 문자열 표현과 목록의 각 개체의 문자열 표현 비교

아래의 예제 코드 (Python 2.7)는 의도 한대로 작동하지만, 파이썬에서이 작업을 수행하는 데 훨씬 좋은 방법이 있다고 가정합니다!

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) 

은 URL 클래스의 __cmp__ 및/또는 __eq__ + __ne__을 구현, (이다,이는 객체가 아니라이 나타내는 문자열을 비교하기 때문이다. 실패) 더 나은 아직

답변

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

또는. (그리고 아마도 또한 __hash__입니다.) 그러면 중복 된 URL이 없는지 자동으로 확인하는 set 개의 URL을 만들 수 있습니다.

+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") 

인쇄합니다.

다른 방법으로 "풍부한"비교를 사용할 수 있지만 그만큼 조금 더 노력해야합니다. total_ordering 클래스 메소드가 도움이 될 수 있습니다.

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 True. 해당 대안을 추가하여 편집했습니다. – Keith