Форум сайта python.su
Добрый день. начинаю изучать python для использования в администрировании сети, решаю примеры.
Задача: есть словарь в котором и ключ и значения представлены кортежами типа {('SW1', ‘Eth0/1’): ('R1', ‘Eth0/0’), ('SW1', ‘Eth0/2’): ('R2', ‘Eth0/0’)…….} среди записей словаря могут встречаться и зеркальные {('R1', ‘Eth0/0’): ('SW1', ‘Eth0/1’)} нужно получить новый словарь, в котором из двух таких “зеркальных” записей оставлена только одна.
я, конечно, коряво, но решил эту проблему, но понимаю что скорее всего не оптимально. Как, не используя никаких дополнительных модулей, можно написать более красиво и коротко? как пишут на просторах инета более питонистически :-)
мой код:
all_conn={('SW1', 'Eth0/1'): ('R1', 'Eth0/0'), ('SW1', 'Eth0/2'): ('R2', 'Eth0/0'), ('SW1', 'Eth0/3'): ('R3', 'Eth0/0'), ('SW1', 'Eth0/5'): ('R6', 'Eth0/1'), ('R1', 'Eth0/0'): ('SW1', 'Eth0/1'), ('R2', 'Eth0/0'): ('SW1', 'Eth0/2'), ('R2', 'Eth0/1'): ('SW2', 'Eth0/11'), ('R3', 'Eth0/0'): ('SW1', 'Eth0/3'), ('R3', 'Eth0/1'): ('R4', 'Eth0/0'), ('R3', 'Eth0/2'): ('R5', 'Eth0/0')} key_list = [key for key,_ in list(all_conn.items())] value_list = [value for _,value in list(all_conn.items())] uniq_conn = {} for i in range(len(key_list)): if key_list[i] in value_list: if value_list.index(key_list[i]) > i: uniq_conn.update({key_list[i]:all_conn[key_list[i]]}) else: uniq_conn.update({key_list[i]:all_conn[key_list[i]]}) print(uniq_conn)
Отредактировано astar (Сен. 22, 2021 14:51:55)
Офлайн
не уверен что это прям таки “более питонистически”, да и “сварщик я не настоящий”, но както так я думаю:
all_conn={('SW1', 'Eth0/1'): ('R1', 'Eth0/0'), ('SW1', 'Eth0/2'): ('R2', 'Eth0/0'), ('SW1', 'Eth0/3'): ('R3', 'Eth0/0'), ('SW1', 'Eth0/5'): ('R6', 'Eth0/1'), ('R1', 'Eth0/0'): ('SW1', 'Eth0/1'), ('R2', 'Eth0/0'): ('SW1', 'Eth0/2'), ('R2', 'Eth0/1'): ('SW2', 'Eth0/11'), ('R3', 'Eth0/0'): ('SW1', 'Eth0/3'), ('R3', 'Eth0/1'): ('R4', 'Eth0/0'), ('R3', 'Eth0/2'): ('R5', 'Eth0/0')} new_conn ={} for key, val in all_conn.items(): if val in new_conn and new_conn[val] == key: continue else: new_conn[key] = val print(new_conn)
[code python][/code]
Отредактировано PEHDOM (Сен. 22, 2021 15:12:47)
Офлайн
all_conn = {('SW1', 'Eth0/1'): ('R1', 'Eth0/0'), ('SW1', 'Eth0/2'): ('R2', 'Eth0/0'), ('SW1', 'Eth0/3'): ('R3', 'Eth0/0'), ('SW1', 'Eth0/5'): ('R6', 'Eth0/1'), ('R1', 'Eth0/0'): ('SW1', 'Eth0/1'), ('R2', 'Eth0/0'): ('SW1', 'Eth0/2'), ('R2', 'Eth0/1'): ('SW2', 'Eth0/11'), ('R3', 'Eth0/0'): ('SW1', 'Eth0/3'), ('R3', 'Eth0/1'): ('R4', 'Eth0/0'), ('R3', 'Eth0/2'): ('R5', 'Eth0/0')} all_conn = {k: v for k, v in all_conn.items() if v not in all_conn} print(all_conn)
Офлайн
FishHook тоже думал написать в одну строку, но тогда оно выкидывает обе “зеркальные записи”.
[code python][/code]
Отредактировано PEHDOM (Сен. 22, 2021 16:00:15)
Офлайн
PEHDOM
не уверен что это прям таки “более питонистически”, да и “сварщик я не настоящий”, но както так я думаю:
for key, val in all_conn
Офлайн
FishHook Спасибо! выглядит кратко, но, к сожалению, возвращает не то что нужно
Но меня радует :-) что я понял, что этот код работает не так как нужно.
Офлайн
FishHookall_conn = {('SW1', 'Eth0/1'): ('R1', 'Eth0/0'), ('SW1', 'Eth0/2'): ('R2', 'Eth0/0'), ('SW1', 'Eth0/3'): ('R3', 'Eth0/0'), ('SW1', 'Eth0/5'): ('R6', 'Eth0/1'), ('R1', 'Eth0/0'): ('SW1', 'Eth0/1'), ('R2', 'Eth0/0'): ('SW1', 'Eth0/2'), ('R2', 'Eth0/1'): ('SW2', 'Eth0/11'), ('R3', 'Eth0/0'): ('SW1', 'Eth0/3'), ('R3', 'Eth0/1'): ('R4', 'Eth0/0'), ('R3', 'Eth0/2'): ('R5', 'Eth0/0')} all_conn = {k: v for k, v in all_conn.items() if v not in all_conn} print(all_conn)
astarКонечно, это не то
FishHook Спасибо! выглядит кратко, но, к сожалению, возвращает не то что нужно
>>> all_conn = {'a': 'b', 'a': 'c', 'b': 'a'} >>> >>> all_conn = {k: v for k, v in all_conn.items() if v not in all_conn} >>> print(all_conn) {'a': 'c'} >>>
astarОдного желания маловато. Мне вот тоже в детстве сказали, что, чтобы вырасти, надо есть чёрный хлеб. Я его ел весь вечер, целую булку съел просто без всего, хотел вырасти повыше. Естественно, я не вырос нифига, хотя очень хотел. И хлеб этот невкусный.
Добрый день. начинаю изучать python для использования в администрировании сети, решаю примеры.
astarВот вопрос к этому словарю сразу возникает “а чо у него такие ключи сложные?”. Если ты думаешь, что это умно, посложнее ключи делать, то как раз наоборот, умнее будет делать ключи как можно проще. Потому что когда с ними надо будет работать, от их простоты зависит то, насколько просто с ними будет работать. Поэтому все сложные элементы надо при первой же возможности разделять на простые элементы.
Задача: есть словарь в котором и ключ и значения представлены кортежами типа {('SW1', ‘Eth0/1’): ('R1', ‘Eth0/0’), ('SW1', ‘Eth0/2’): ('R2', ‘Eth0/0’)…….}
astarДа, ты не знаешь вообще ничего.
я, конечно, коряво, но решил эту проблему, но понимаю что скорее всего не оптимально.
astarДо питона есть ещё программирование. Там много всякой теории, которая применяется на практике. И вот только после неё начинается то, что там принято в питоне. То есть неважно, очень питонистически или не очень питонистически ты напишешь неправильный код.
как пишут на просторах инета более питонистически :-)
Отредактировано py.user.next (Сен. 23, 2021 00:13:09)
Офлайн