some_dict = {"firstname":"Albert","nickname":"Albert","surname":"Likins","username":"Angel"}
Je voudrais rendre les clés de mon dict où leur valeur, existe depuis plus d'une fois.
Quelqu'un pourrait-il me montrer comment mettre cela en œuvre?
a_list = []
for k,v in some_dict.iteritems():
if v in some_dict.values() and v != some_dict.keys(k):
a_list.append(k)
Tout d’abord, retournez le dictionnaire dans un multidict inverse, en mappant chaque valeur sur toutes les clés auxquelles elle mappe. Comme ça:
>>> some_dict = {"firstname":"Albert","nickname":"Albert","surname":"Likins","username":"Angel"}
>>> rev_multidict = {}
>>> for key, value in some_dict.items():
... rev_multidict.setdefault(value, set()).add(key)
À présent, vous recherchez uniquement les clés dans le multidict qui ont plus d’une valeur. C'est facile:
>>> [key for key, values in rev_multidict.items() if len(values) > 1]
['Albert']
Sauf que les clés multidictives sont les valeurs dict d'origine. Il s’agit donc de chaque valeur répétée, et non de toutes les clés correspondant à chaque valeur répétée. Mais vous savez quoi est toutes les clés correspondant à chaque valeur répétée?
>>> [values for key, values in rev_multidict.items() if len(values) > 1]
[{'firstname', 'nickname'}]
Bien sûr, cela vous donne une liste d'ensembles. Si vous voulez mettre cela dans une seule liste ou ensemble, c'est facile. Vous pouvez utiliser chain.from_iterable
, ou une compréhension imbriquée, ou n’importe laquelle des autres astuces habituelles. Par exemple:
>>> set(chain.from_iterable(values for key, values in rev_multidict.items() if len(values) > 1))
{'firstname', 'nickname'}
Je commencerais par retourner les clés et les valeurs:
flipped = {}
for key, value in d.items():
if value not in flipped:
flipped[value] = [key]
else:
flipped[value].append(key)
Vous pouvez le faire plus efficacement avec collections.defaultdict(set)
. flipped
ressemblera à votre dictionnaire:
{
'Albert': ['nickname', 'firstname'],
'Angel': ['username'],
'Likins': ['surname']
}
Cette méthode ne nécessite ni bibliothèques externes ni une instruction if
:
reverse_dic = {}
for k, v in original_dic.iteritems():
reverse_dic[v] = reverse_dic.get(v, [])
reverse_dic[v].append(k)
Si votre ensemble de données n'est pas trop volumineux, vous n'avez pas besoin d'inverser multidict. Vous pouvez utiliser compter sur dict.values () et retourner les clés souhaitées en itérant sur dict.items ().
desired_keys = []
vals = some_dict.values()
for key, value in some_dict.items():
if vals.count(value) > 1:
desired_keys.append(key)
J'espère que cela t'aides!
Cette méthode utilise 'try' et 'for'.
données d'origine
original_dict = {"firstname":"Albert", "nickname":"Albert", "surname":"Likins", "username":"Angel"}
code
reverse_dict = {}
for key, value in original_dict.items():
try:reverse_dict[value].append(key)
except:reverse_dict[value] = [key]
résultat
>>> reverse_dict
{'Albert': ['firstname', 'nickname'], 'Likins': ['surname'], 'Angel': ['username']}
>>> [value for key, value in reverse_dict.items() if len(value) > 1]
[['firstname', 'nickname']]
Utiliser "defaultdict":
from collections import defaultdict
s = [('yellow', 1), ('blue', 2), ('yellow', 3), ('blue', 4), ('red', 1)]
d = defaultdict(list)
for k, v in s:
d[k].append(v)
for key, value in d.items():
if len(value) > 1:
print "key: %s has multiple values: %r" % (key, value)