Найти - Пользователи
Полная версия: Как отсеять объекты с одинаковыми атрибутами?
Начало » Python для новичков » Как отсеять объекты с одинаковыми атрибутами?
1
mirak
У меня есть объекты созадные таким образом
Proxy = namedtuple('Proxy', 'proto, host, port, username, password')
Как мне отсеять все прокси по одинаковому атрибуту host? Я нагуглил, что это делается с помощью функции set() и переопределением методов __hash__ и __eq__. Но так как я нуб в питоне, ума не приложу как это сделать.
mirak
Решение
class Proxy(object):
    def __init__(self, proto, host, port, username, password):
        self.proto = proto
        self.host = host
        self.port = port
        self.username = username
        self.password = password
    def __eq__(self, other):
        return self.host == other.host
    def __hash__(self):
        return hash(self.host)
proxies = set(proxies)
py.user.next
>>> import collections
>>> import pprint
>>> 
>>> pp = pprint.pprint
>>> 
>>> Proxy = collections.namedtuple(
...     'Proxy', 'proto, host, port, username, password')
>>> 
>>> lst = [Proxy(*'abcd1'),
...        Proxy(*'abcd2'),
...        Proxy(*'accd3'),
...        Proxy(*'adcd4'),
...        Proxy(*'adcd5')]
>>> 
>>> pp(lst)
[Proxy(proto='a', host='b', port='c', username='d', password='1'),
 Proxy(proto='a', host='b', port='c', username='d', password='2'),
 Proxy(proto='a', host='c', port='c', username='d', password='3'),
 Proxy(proto='a', host='d', port='c', username='d', password='4'),
 Proxy(proto='a', host='d', port='c', username='d', password='5')]
>>> 
>>> lst = list({t.host:t for t in lst}.values())
>>> 
>>> pp(lst)
[Proxy(proto='a', host='d', port='c', username='d', password='5'),
 Proxy(proto='a', host='c', port='c', username='d', password='3'),
 Proxy(proto='a', host='b', port='c', username='d', password='2')]
>>>
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB