2010-07-15 3 views
3

Je souhaite dupliquer des valeurs uniques dans un dict. Il ressemble à ceci:Comment un dict unique en valeur?

d = { 
"a":1, 
"b":2, 
"c":2, 
"d":3, 
"e":4, 
"f":5, 
"g":1, 
"h":2, 
"i":2, 
"j":1, 
"k":1} 

Voici ce que je faisais:

# sort and unique the dict values 
obj = d.values() 
K = [] 
K = sorted(list(zip(*[(x,K.append(x)) for x in obj if not x in K])[0] 

V=[] 
for v1 in L: 
    V.append([k for k, v in obj.iteritems() if v == v1][0]) 
d_out = dict(zip(K, V)) 

1. Alors, est-ce le K, V dans un ordre? Aussi, il peut être un peu complexe, quelqu'un peut-il donner une solution simple à un dict par ses valeurs?

2. Ce qui suit peut-il être plus simple?

for v1 in L: 
    V.append([k for k, v in obj.iteritems() if v == v1][0]) 

Ce ne fonctionne pas sur mon test:

[V.append([k for k, v in obj.iteritems() if v == v1][0]) for v1 in L] 

3. je réalise que je peux utiliser la valeur de clé de swap pour y parvenir (un dict par sa valeur unique), mais je ne idée comment sélectionner la clé en cas d'échange a provoqué un conflit avec cette clé:

dict((value, key) for key, value in my_dict.iteritems()) 

Je sais que si échanger à nouveau la valeur sera unique, mais , cela écrase juste la clé quand un conflit clé se produit, ne donnant aucune chance de faire une sélection. Je me sens confus pourquoi cela ne donne aucune erreur de conflit clé? Et puis-je faire quelque chose pour sélectionner la clé à côté de la façon laide d'écraser la touche du nouveau dict plus tard?

4. J'ai cherché et trouver des « Aucun » valeurs dict python sont bien discuté, quelqu'un peut me donner un échantillon à quoi il sert et ce qu'elle aura eu un impact dans l'utilisation dict python?

+0

jathanism merci, je pense que vous voulez dire que je dois cocher sur la réponse de quelqu'un au lieu d'ajouter la valeur d'utilité. –

Répondre

1
try it out: 

from collections import defaultdict 
dout = defaultdict(dict) 
for k,v in d.iteritems(): 
    dout[v] = k 
dout = dict(dout) 
fdict = dict(zip(dout.values(), dout.keys())) 

N.B.: dictionnaire ne pas clé en double si le dictionnaire d'entrée n'a pas double clé espérons qu'il sera fonctionne

+0

merci, échange 2 fois ne peut vraiment pas résoudre mon problème, comme je l'ai dit sur ma question, mais supposons que les valeurs seront dupliquées, puis comment sélectionner la paire valeur <-> dans le nouveau dict généré? où est le point de contrôle que je peux mettre? –

3
  1. Un dict n'est pas une séquence. Il n'y a pas de commande.

  2. Vous avez besoin d'une approche globale plus simple.

  3. Une dict ne donne pas une "erreur de conflit de clé". Il suppose que vous voulez remplacer l'ancienne valeur par la nouvelle valeur.

  4. Je ne comprends pas ce que vous demandez ici.

La solution ci-dessous est un moyen plus simple d'éliminer les valeurs de dupe d'un dictionnaire. Ajustez le tri ou la boucle d'insertion pour contrôler quelles touches doivent apparaître dans la dict finale.

d = { 
    "a":1, 
    "b":2, 
    "c":2, 
    "d":3, 
    "e":4, 
    "f":5, 
    "g":1, 
    "h":2, 
    "i":2, 
    "j":1, 
    "k":1} 

# Extract the dictionary into a list of (key, value) tuples. 
t = [(k, d[k]) for k in d] 

# Sort the list -- by default it will sort by the key since it is 
# first in the tuple. 
t.sort() 

# Reset the dictionary so it is ready to hold the new dataset. 
d = {} 

# Load key-values into the dictionary. Only the first value will be 
# stored. 
for k, v in t: 
    if v in d.values(): 
     continue 
    d[k] = v 

print d 
1

cela est peut-être d'un peu d'aide:

import collections 

d = ... # like above 
d1 = collections.defaultdict(list) 

for k, v in d.iteritems(): 
    d1[v].append(k) 

print d1 
Questions connexes