Найти - Пользователи
Полная версия: как более красиво сделать код поиска и удаления "зеркальных" записей в словаре
Начало » Python для новичков » как более красиво сделать код поиска и удаления "зеркальных" записей в словаре
1
astar
Добрый день. начинаю изучать 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)
PEHDOM
не уверен что это прям таки “более питонистически”, да и “сварщик я не настоящий”, но както так я думаю:
 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)
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)
PEHDOM
FishHook тоже думал написать в одну строку, но тогда оно выкидывает обе “зеркальные записи”.

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

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

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

Но меня радует :-) что я понял, что этот код работает не так как нужно.
py.user.next
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
как пишут на просторах инета более питонистически :-)
До питона есть ещё программирование. Там много всякой теории, которая применяется на практике. И вот только после неё начинается то, что там принято в питоне. То есть неважно, очень питонистически или не очень питонистически ты напишешь неправильный код.

Вот тренируйся на кошечках. Ставь туда буковки простые или числа в словарь и тренируйся. А потом, когда на буковках получится, когда будет всё понятно как дважды два и всё правильно, тогда ты и занесёшь туда вместо буковок сетевые интерфейсы. Так учатся все.
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