Уведомления

Группа в Telegram: @pythonsu

#1 Сен. 19, 2012 15:54:38

Jeck290
От:
Зарегистрирован: 2010-01-03
Сообщения: 99
Репутация: +  0  -
Профиль   Отправить e-mail  

Два списка , найти повторяющееся IP и MAC адреса

Имеются два списка один базовый с ним сравнивают и загружаемый, оба списка имеют одну и туже структуру

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 адресу, подскажите…



Прикреплённый файлы:
attachment 14.rar (1,9 KБ)

Офлайн

#2 Сен. 19, 2012 17:35:45

reclosedev
От: Н.Новгород
Зарегистрирован: 2012-03-29
Сообщения: 870
Репутация: +  173  -
Профиль   Отправить e-mail  

Два списка , найти повторяющееся IP и MAC адреса

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'}

Офлайн

#3 Сен. 19, 2012 18:33:22

Viktor_Zorichev
Зарегистрирован: 2012-09-15
Сообщения: 14
Репутация: +  3  -
Профиль   Отправить e-mail  

Два списка , найти повторяющееся IP и MAC адреса

Практически тоже самое, что и в ответе выше, но:
- во второй словарь включены только те пары значений, в которых 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'}

Отредактировано Viktor_Zorichev (Сен. 19, 2012 18:46:30)

Офлайн

#4 Сен. 19, 2012 19:11:40

reclosedev
От: Н.Новгород
Зарегистрирован: 2012-03-29
Сообщения: 870
Репутация: +  173  -
Профиль   Отправить e-mail  

Два списка , найти повторяющееся IP и MAC адреса

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

Отредактировано reclosedev (Сен. 19, 2012 19:13:15)

Офлайн

#5 Сен. 20, 2012 11:58:40

Jeck290
От:
Зарегистрирован: 2010-01-03
Сообщения: 99
Репутация: +  0  -
Профиль   Отправить e-mail  

Два списка , найти повторяющееся IP и MAC адреса

Ребята спасибо всем ! То что нужно !!!



Офлайн

#6 Сен. 20, 2012 13:35:36

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

Два списка , найти повторяющееся IP и MAC адреса

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



Офлайн

#7 Сен. 20, 2012 14:10:10

sp3
От:
Зарегистрирован: 2010-01-12
Сообщения: 405
Репутация: +  18  -
Профиль   Отправить e-mail  

Два списка , найти повторяющееся IP и MAC адреса

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



Офлайн

#8 Сен. 20, 2012 15:16:36

reclosedev
От: Н.Новгород
Зарегистрирован: 2012-03-29
Сообщения: 870
Репутация: +  173  -
Профиль   Отправить e-mail  

Два списка , найти повторяющееся IP и MAC адреса

Андрей Светлов
**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

Офлайн

#9 Сен. 20, 2012 15:59:06

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

Два списка , найти повторяющееся IP и MAC адреса

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

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



Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version