Найти - Пользователи
Полная версия: Два списка , найти повторяющееся IP и MAC адреса
Начало » Центр помощи » Два списка , найти повторяющееся IP и MAC адреса
1
Jeck290
Имеются два списка один базовый с ним сравнивают и загружаемый, оба списка имеют одну и туже структуру

192.168.14.2 00-0F-EA-62-31-0B
192.168.14.5 00-27-19-C0-27-85
192.168.14.6 B0-48-7A-DC-CC-29

два значения IP адрес и MAC адрес между ними имеется пробел
нужно найти IP адреса не встречающееся в базовом списке. и так же проверить MAC адреса если на
каком то IP адресе он сменился то это нужно пометить мол MAC адрес не совпадает с основной базой

вот что получилось:
Basespisok = {}
Newspisok = {}
open_file = open('D:\\Base.txt', 'r') //Базовый текстовый документ
for names in open_file:
    a = names.split()
    Basespisok[a[0]]=a[1]
open_file2 = open('D:\\14new.txt','r') // Проверяеммый текстовик
for names2 in open_file2:
    a = names2.split()
    Newspisok[a[0]]=a[1]
dict3 = dict([x for x in Newspisok.items() if x not in Basespisok.items()])
print dict3


не могу разобраться как сделать проверку по MAC адресу, подскажите…

reclosedev
with open("Base.txt") as f:
    base_ips = dict(line.split() for line in f)
with open("14.txt") as f:
    input_ips = dict(line.split() for line in f)
 
base_macs = {mac: ip for ip, mac in base_ips.items()}
new_ips = {ip: mac for ip, mac in input_ips.items()
           if ip not in base_ips}
new_macs = {mac: ip for ip, mac in input_ips.items()
            if mac not in base_macs}
 
from pprint import pprint
pprint(new_ips)
pprint(new_macs)

{'192.168.14.117': '00-30-4F-5B-BD-64',
 '192.168.14.143': '14-DA-E9-6C-86-53',
 '192.168.14.157': '8C-89-A5-66-BE-F1',
 '192.168.14.179': '00-8A-8D-8D-92-8F',
 '192.168.14.180': '00-24-54-CF-A0-37',
 '192.168.14.21': '00-24-54-29-E1-65',
 '192.168.14.22': 'F4-6D-04-02-2F-1A',
 '192.168.14.252': '48-5B-39-2C-7E-89',
 '192.168.14.253': '14-DA-E9-A3-C0-04',
 '192.168.14.3': 'C8-3A-35-D8-FD-B5',
 '192.168.14.38': '10-78-D2-D4-5E-3B',
 '192.168.14.45': '00-30-67-74-7E-45',
 '192.168.14.87': '60-EB-69-60-0F-21',
 '192.168.14.99': '00-1F-C6-F1-4F-02'}
{'00-02-DC-E1-66-12': '192.168.14.15',
 '00-13-77-9F-82-EB': '192.168.14.60',
 '00-1F-C6-F1-4F-02': '192.168.14.99',
 '00-24-54-29-E1-65': '192.168.14.21',
 '00-24-54-CF-A0-37': '192.168.14.180',
 '00-30-4F-5B-BD-64': '192.168.14.117',
 '00-30-67-74-7E-45': '192.168.14.45',
 '00-8A-8D-8D-92-8F': '192.168.14.179',
 '00-E0-4D-85-24-35': '192.168.14.96',
 '10-78-D2-D4-5E-3B': '192.168.14.38',
 '14-DA-E9-6C-86-53': '192.168.14.143',
 '14-DA-E9-A3-C0-04': '192.168.14.253',
 '48-5B-39-2C-7E-89': '192.168.14.252',
 '60-EB-69-60-0F-21': '192.168.14.87',
 '8C-89-A5-66-BE-F1': '192.168.14.157',
 'C8-3A-35-D8-FD-B5': '192.168.14.3',
 'F4-6D-04-02-2F-1A': '192.168.14.22'}
Viktor_Zorichev
Практически тоже самое, что и в ответе выше, но:
- во второй словарь включены только те пары значений, в которых ip одинаковый для обоих списков, а вот mac - разный.
reclosedev, благодаря вам узнал о функции pprint, дякую

from pprint import pprint
with open('Base.txt') as f:
    base = dict(line.split() for line in f)
with open('14.txt') as f:
    new = dict(line.split() for line in f)
ip_new = {ip: mac for ip, mac in new.items() if ip not in base.keys()}
mac_new_ip_same = {ip: mac for ip, mac in new.items() if ip in base.keys()\
                  and base[ip] != new[ip]}
pprint(ip_new)
pprint(mac_new_ip_same)

{'192.168.14.117': '00-30-4F-5B-BD-64',
 '192.168.14.143': '14-DA-E9-6C-86-53',
 '192.168.14.157': '8C-89-A5-66-BE-F1',
 '192.168.14.179': '00-8A-8D-8D-92-8F',
 '192.168.14.180': '00-24-54-CF-A0-37',
 '192.168.14.21': '00-24-54-29-E1-65',
 '192.168.14.22': 'F4-6D-04-02-2F-1A',
 '192.168.14.252': '48-5B-39-2C-7E-89',
 '192.168.14.253': '14-DA-E9-A3-C0-04',
 '192.168.14.3': 'C8-3A-35-D8-FD-B5',
 '192.168.14.38': '10-78-D2-D4-5E-3B',
 '192.168.14.45': '00-30-67-74-7E-45',
 '192.168.14.87': '60-EB-69-60-0F-21',
 '192.168.14.99': '00-1F-C6-F1-4F-02'}
{'192.168.14.15': '00-02-DC-E1-66-12',
 '192.168.14.60': '00-13-77-9F-82-EB',
 '192.168.14.96': '00-E0-4D-85-24-35'}
reclosedev
Viktor_Zorichev
во второй словарь включены только те пары значений, в которых ip одинаковый для обоих списков, а вот mac - разный.
Да, ТС наверное это и хотел. Я невнимательно прочитал условия.

Viktor_Zorichev
if ip not in base.keys()
А вот сложность увеличивать на ровном месте не нужно.
“ip not in base” - O(1),
“ip not in base.keys()” - O(n)

Да и в этом случае вместо сокращенной записи, лучше по циклу за один проход все собрать:
ip_new = {}
mac_new_ip_same = {}
for ip, mac in new.items():
    if ip not in base:
        ip_new[ip] = mac
    elif mac != base[ip]:
        mac_new_ip_same[ip] = mac
Jeck290
Ребята спасибо всем ! То что нужно !!!
Андрей Светлов

reclosedev, а откуда сведения что “ip not in base.keys()” - O(n) ???? Я вижу тот же самый поиск по hashtable => O(1)

sp3
Андрей Светлов
reclosedev, а откуда сведения что “ip not in base.keys()” - O(n) ???? Я вижу тот же самый поиск по hashtable => O(1)
А я вижу создание нового списка и сопутствующее увлечение времени и ресурсов :-)
reclosedev
Андрей Светлов
**reclosedev**, а откуда сведения что “ip not in base.keys()” - O(n) ????
Я вижу тот же самый поиск по hashtable => O(1)
Вы говорите о Python 3? Интересное нововведение. http://ideone.com/6y9uO
В Python 2.7.2 - O(n) http://ideone.com/ZxrgM

Андрей Светлов

А, ну да. По привычке предполагаю «тройку» по уумолчанию.

Кстати, ip not in base тоже должно давать O(1) (и на 2.7).

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