Форум сайта python.su
Имеются два списка один базовый с ним сравнивают и загружаемый, оба списка имеют одну и туже структуру
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
Прикреплённый файлы:
14.rar (1,9 KБ)
Офлайн
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'}
Офлайн
Практически тоже самое, что и в ответе выше, но:
- во второй словарь включены только те пары значений, в которых 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)
Офлайн
Viktor_ZorichevДа, ТС наверное это и хотел. Я невнимательно прочитал условия.
во второй словарь включены только те пары значений, в которых ip одинаковый для обоих списков, а вот mac - разный.
Viktor_ZorichevА вот сложность увеличивать на ровном месте не нужно.
if ip not in base.keys()
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)
Офлайн
Ребята спасибо всем ! То что нужно !!!
Офлайн
reclosedev, а откуда сведения что “ip not in base.keys()” - O(n) ???? Я вижу тот же самый поиск по hashtable => O(1)
Офлайн
Андрей СветловА я вижу создание нового списка и сопутствующее увлечение времени и ресурсов :-)
reclosedev, а откуда сведения что “ip not in base.keys()” - O(n) ???? Я вижу тот же самый поиск по hashtable => O(1)
Офлайн
Андрей СветловВы говорите о Python 3? Интересное нововведение. http://ideone.com/6y9uO
**reclosedev**, а откуда сведения что “ip not in base.keys()” - O(n) ????
Я вижу тот же самый поиск по hashtable => O(1)
Офлайн
А, ну да. По привычке предполагаю «тройку» по уумолчанию.
Кстати, ip not in base
тоже должно давать O(1) (и на 2.7).
Офлайн