Как удалить строку из списка с общей частью

1

Мне нужно удалить дубликат из списка с общими частями в 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 - это мой первоначальный список).

Спасибо

  • 0
    Вы пытались создать новый список, заполнить его измененными значениями и затем заменить исходный список?
  • 0
    какой формат строки? Является ли Addition / Bitsquating / ... всегда одним словом?
Показать ещё 1 комментарий
Теги:

1 ответ

0
Лучший ответ

Получение уникальных имен хостов

Вы можете перебирать строки и каждый раз добавлять имя домена в 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]))
  • 0
    Спасибо за ваш ответ Я уже получил список доменных имен и мне нужно сохранить уникальные строки - Insertion domainname4.com 206.188.200.6 - Insertion domainname5.com 206.188.200.7 из первого списка. Фактически удалите строки с дублированным доменным именем
  • 0
    @ Pixels01: см. Редактировать.
Показать ещё 5 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню