Utilisez un dict de jeux:
d={ 'k1': [1,2,3],
'k2': [2],
'k3': [10],
'k4': [3,2]
}
com_keys={}
for k, v in d.items():
for e in v:
com_keys.setdefault(e, set()).add(k)
print com_keys
# {1: set(['k1']), 10: set(['k3']), 3: set(['k1', 'k4']), 2: set(['k2', 'k1', 'k4'])}
Alors si vous voulez que ceux qui ont plus d'une clé en commun, filtrez simplement avec une compréhension dict (ou similaire pour Pythons plus):
>>> {k:v for k,v in com_keys.items() if len(v)>1 }
{2: set(['k2', 'k1', 'k4']), 3: set(['k1', 'k4'])}
Il obtenir un peu plus difficile si votre dict est une combinaison non homogène de conteneurs qui prennent en charge l'itération (listes, tuples, etc.) avec des « articles uniques » qui soit ne ne supporte pas l'itération (ints, floats) ou les choses que vous ne voulez pas itérer avec une boucle for
(chaînes, unicode, autres dicts, etc.)
Par exemple, supposons que vous avez une combinaison de listes et d'éléments uniques qui sont ints et cordes:
import collections
d={ 'k1': [1,2,3],
'k2': 2,
'k3': [10],
'k4': [3,2],
'k5': 'string',
'k6': ['string',2]
}
com_keys={}
for k, v in d.items():
if not isinstance(v, basestring) and isinstance(v, collections.Iterable):
for e in v:
com_keys.setdefault(e, set()).add(k)
else:
com_keys.setdefault(v, set()).add(k)
print com_keys
# {1: set(['k1']), 10: set(['k3']), 3: set(['k1', 'k4']), 2: set(['k2', 'k1', 'k6', 'k4']), 'string': set(['k6', 'k5'])}
print {k:v for k,v in com_keys.items() if len(v)>1 }
# {2: set(['k2', 'k1', 'k6', 'k4']), 3: set(['k1', 'k4']), 'string': set(['k6', 'k5'])}
Quels ont été les résultats de vos tentatives? – ooga
Comment une clé de votre dictionnaire peut-elle avoir plusieurs valeurs? Ou sont vos listes de valeurs de dictionnaire (tuples, ensembles, n'importe quel récipient) qui peuvent contenir une ou plusieurs valeurs? – Hyperboreus
Est-il important que vous connaissiez la clé avec laquelle la clé a une valeur commune? –