Уведомления

Группа в Telegram: @pythonsu

#1 Дек. 12, 2017 22:33:00

Lena13_08
Зарегистрирован: 2017-10-14
Сообщения: 26
Репутация: +  0  -
Профиль   Отправить e-mail  

Как выбрать из словаря все ключи которые имеют хотябы одно одинаковое значение

мне нужно выбрать все пары (key1,key2) которые имеют хотябы одно одинаковое значение
вот например у меня есть дневник

dict = { 'abc':[a, b], 'cdf':[b], 'gh':[a], 'fh':[g], 'hfz':[g]}
Я могу создать всевозможные пары с библиотекой itertools
 pairs=list(itertools.combinations(dict.keys(),2))

Это даст мне пары:
(abc,cdf) #имеют
(cdf,gh)
(cdf,fh)
(cdf,hfz)
(abc,gh)#имеют
(abc,fh)
(abc,hfz)
(gh,fh)
(gh,hfz)
(fh,hfz)#имеют
Но из этих пар мне нужны только те что имеют общее значение тоисть:
(abc,cdf) #имеют b
(abc,gh)#имеют a
(fh,hfz)#имеют g

PS. Для лучшей визуализации проблемы: я создаю сеть где ключи это вершины которые будут иметь ребро только в стучае того если у них есть общее значение

Отредактировано Lena13_08 (Дек. 12, 2017 22:35:54)

Офлайн

#2 Дек. 12, 2017 23:06:48

Isem
От:
Зарегистрирован: 2010-08-27
Сообщения: 447
Репутация: +  7  -
Профиль   Отправить e-mail  

Как выбрать из словаря все ключи которые имеют хотябы одно одинаковое значение

 from itertools import combinations
dct = { 'abc':{a, b}, 'cdf':{b}, 'gh':{a}, 'fh':{g}, 'hfz':{g}}
for p1, p2 in combinations(dct, 2):
    if dct[p1] & dct[p2]: print(p1, p2, sep = ', ')

Здесь важно, чтобы значения в словаре были множествами. Если принципиально, что изначально они не множества, то просто делаем их таковыми:
 dct = {k:set(v) for k,v in dct.items()}
Или это можно делать при проверке, но это гораздо менее эффективно:
     if set((dct[p1]) & set(dct[p2]): print(p1, p2, sep = ', ')

Если словарь очень большой, то более эффективный алгоритм - это “задом наперед”. То есть сначала надо поменять значения и ключи в словаре местами, а потом просто вывести те значения, которых 2 и более (при этом если их больше двух, то перебрать все разные пары). Но это чуть сложнее.



Отредактировано Isem (Дек. 12, 2017 23:23:28)

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version