Уведомления

Группа в Telegram: @pythonsu

#1 Фев. 27, 2016 18:47:26

mirak
Зарегистрирован: 2016-02-24
Сообщения: 34
Репутация: +  0  -
Профиль   Отправить e-mail  

Как отсеять объекты с одинаковыми атрибутами?

У меня есть объекты созадные таким образом

Proxy = namedtuple('Proxy', 'proto, host, port, username, password')
Как мне отсеять все прокси по одинаковому атрибуту host? Я нагуглил, что это делается с помощью функции set() и переопределением методов __hash__ и __eq__. Но так как я нуб в питоне, ума не приложу как это сделать.

Офлайн

#2 Фев. 28, 2016 00:25:57

mirak
Зарегистрирован: 2016-02-24
Сообщения: 34
Репутация: +  0  -
Профиль   Отправить e-mail  

Как отсеять объекты с одинаковыми атрибутами?

Решение

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)

Отредактировано mirak (Фев. 28, 2016 00:27:01)

Офлайн

#3 Фев. 28, 2016 02:20:04

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10016
Репутация: +  857  -
Профиль   Отправить e-mail  

Как отсеять объекты с одинаковыми атрибутами?

>>> 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')]
>>>



Отредактировано py.user.next (Фев. 28, 2016 02:20:55)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version