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)

(現状では、オブジェクトが表す文字列ではなくオブジェクトを比較するため、これは失敗します。)

4

2 に答える 2

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

またはさらに良いことに、urlクラスに実装__cmp__および/または__eq__+ 。__ne__(そしておそらくまた。)次に、重複するURLがないことを自動的に保証するURLを__hash__作成できます。set

于 2012-10-20T21:36:34.883 に答える
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")

「Notin」を出力します。

または、「豊富な」比較を使用することもできますが、それはもう少し手間がかかります。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」という名前の文字列属性で機能するようになります。ただし、他のオブジェクトを比較すると、これは失敗します。

于 2012-10-20T21:56:01.170 に答える