2014-04-24 3 views
2

J'ai un dictionnaire de "259136 clés" et chacune de ces clés, ont 1 ou plusieurs valeurs.Articles communs entre toutes les clés d'un dictionnaire

Mon objectif est "de trouver les clés qui ont au moins une valeur commune avec une autre clé dans la liste des clés?"

J'ai essayé différentes façons de résoudre ce problème, mais je cherchais une solution plus rapide. J'ai essayé

  1. pour chaque touche comparer avec les 259135 clés pour vérifier l'état ci-dessus
  2. inverser le dictionnaire de la valeur clé à la clé de valeur, maintenant la valeur devient clé et cette façon je vais avoir deux dictionnaires et moi peut aller à la première et basé sur les valeurs dans le premier retirer toutes les valeurs de la seconde.
+0

Quels ont été les résultats de vos tentatives? – ooga

+4

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

+3

Est-il important que vous connaissiez la clé avec laquelle la clé a une valeur commune? –

Répondre

2

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'])} 
+0

Merci cela aide – mparida

Questions connexes