Мне нужно удалить дубликат из списка с общими частями в python. Мой список выглядит примерно так:
- Addition domainname1.com 80.80.80.80
+ Addition domainname1.com 80.80.80.81
- Bitsquatting domainname2.com 104.160.171.87
+ Bitsquatting domainname2.com 104.160.172.85
- Homoglyph domainname3.com 206.188.193.4
- Insertion domainname4.com 206.188.200.6
- Insertion domainname5.com 206.188.200.7
+ Insertion domainname5.com 206.188.200.8
Из этого списка я хочу сохранить только строки с уникальным доменным именем (а не строкой с общим доменным именем и другим IP-адресом):
- Homoglyph domainname3.com 206.188.193.4
- Insertion domainname4.com 206.188.200.6
Я попытался использовать split()
для получения списка имени домена:
domainname1.com
domainname1.com
domainname2.com
domainname2.com
domainname3.com
domainname4.com
domainname5.com
domainname5.com
и удалить общее имя домена, но я застрял, чтобы удалить соответствующую строку из предыдущего списка.
for line in change:
name = line.split()
domain_name = name[2]
Мой способ получить список доменных имен (change
- это мой первоначальный список).
Спасибо
Вы можете перебирать строки и каждый раз добавлять имя домена в set
, например:
my_set = {line.split()[2] for line in change}
the_domains = list(my_set)
Учитывая, что все строки соответствуют формату, в котором домен является одним "словом", и перед этим доменом есть два слова, это будет делать трюк.
Вышеупомянутое не гарантирует сохранения заказа. Если это требование, вы можете использовать фильтр uniqness, например:
def uniq(iterable):
already = set()
for x in iterable:
if x not in already:
yield x
already.add(x)
Затем мы можем обработать его так:
the_domains = list(uniq(line.split()[2] for line in change))
Мы можем немного обобщить функцию uniq
чтобы разрешить ключевой параметр, например:
def uniq(iterable, key=lambda x: x):
already = set()
for x in iterable:
fx = key(x)
if fx not in already:
yield x
already.add(fx)
Затем мы можем использовать первые строки имен хостов:
the_domains = list(uniq(change, key=lambda line: line.split()[2]))
Мы также можем удалить все строки с именем хоста, которое происходит два или более, с помощью счетчика:
from collections import Counter
def non_dup(iterable, key=lambda x: x):
iterable = list(iterable)
cntr = Counter(map(key, iterable))
return filter(lambda x: cntr[key(x)] < 2, iterable)
затем мы фильтруем с помощью:
the_domains = list(non_dup(change, key=lambda line: line.split()[2]))
- Insertion domainname4.com 206.188.200.6 - Insertion domainname5.com 206.188.200.7
из первого списка. Фактически удалите строки с дублированным доменным именем
Addition
/Bitsquating
/ ... всегда одним словом?