Уведомления

Группа в Telegram: @pythonsu

#1 Сен. 22, 2021 14:49:02

astar
Зарегистрирован: 2021-09-22
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

как более красиво сделать код поиска и удаления "зеркальных" записей в словаре

Добрый день. начинаю изучать 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)

Офлайн

#2 Сен. 22, 2021 15:11:50

PEHDOM
Зарегистрирован: 2016-11-28
Сообщения: 2196
Репутация: +  294  -
Профиль   Отправить e-mail  

как более красиво сделать код поиска и удаления "зеркальных" записей в словаре

не уверен что это прям таки “более питонистически”, да и “сварщик я не настоящий”, но както так я думаю:

 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)

Офлайн

#3 Сен. 22, 2021 15:52:37

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

как более красиво сделать код поиска и удаления "зеркальных" записей в словаре

   
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)



Офлайн

#4 Сен. 22, 2021 15:59:40

PEHDOM
Зарегистрирован: 2016-11-28
Сообщения: 2196
Репутация: +  294  -
Профиль   Отправить e-mail  

как более красиво сделать код поиска и удаления "зеркальных" записей в словаре

FishHook тоже думал написать в одну строку, но тогда оно выкидывает обе “зеркальные записи”.



==============================
Помещайте код в теги:
[code python][/code]
Бериегите свое и чужое время.

Отредактировано PEHDOM (Сен. 22, 2021 16:00:15)

Офлайн

#5 Сен. 22, 2021 16:20:22

astar
Зарегистрирован: 2021-09-22
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

как более красиво сделать код поиска и удаления "зеркальных" записей в словаре

PEHDOM
не уверен что это прям таки “более питонистически”, да и “сварщик я не настоящий”, но както так я думаю:

Огромное спасибо! что то я запутался в двух соснах!
изначально пытался ошибочно написать так:
 for key, val in all_conn

но в key и val попадали первая и вторая части кортежей ключей! и пока я додумался добавить .items() я уже нагородил списков и т.п.

Офлайн

#6 Сен. 22, 2021 16:30:48

astar
Зарегистрирован: 2021-09-22
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

как более красиво сделать код поиска и удаления "зеркальных" записей в словаре

FishHook Спасибо! выглядит кратко, но, к сожалению, возвращает не то что нужно

Но меня радует :-) что я понял, что этот код работает не так как нужно.

Офлайн

#7 Сен. 23, 2021 00:07:25

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9873
Репутация: +  853  -
Профиль   Отправить e-mail  

как более красиво сделать код поиска и удаления "зеркальных" записей в словаре

FishHook
  
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)
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'}
>>>
Он должен оставить и ab, и ac.

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)

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version