1
votes

Comment puis-je faire une sorte de différent en utilisant Django

J'ai ce tableau qui contient quelques dictionnaires:

a = [{'name': 'Peter', 'email': '', 'color': 'red'}]

Mais j'ai essayé de faire ceci: list (set (a)) et ça ne marche malheureusement pas J'obtiens ceci:

TypeError: type unhashable: 'dict'

Savez-vous comment puis-je résoudre ce problème? Je veux dire que j'aimerais avoir:

a = [{'name': 'Peter', 'email': '', 'color': 'red'},
 {'name': 'Peter', 'email': '', 'color': 'red'},
 {'name': 'Peter', 'email': '', 'color': 'red'}]

Merci!


1 commentaires

Que voulez-vous accomplir exactement? Votre message et surtout la question ne sont pas clairs.


3 Réponses :


0
votes

Ceci résoudra votre problème:

set(tuple(d.items()) for d in a)

Cela convertira la liste des dictionnaires en une liste de tuples, chaque tuple contenant les éléments du dictionnaire. Désormais, les tuples peuvent être hachés, différents des dictionnaires. Nous supprimons en utilisant une compréhension d'ensemble.

Une autre alternative serait:

[dict(t) for t in {tuple(d.items()) for d in a}]

Qui renvoie {(('name', 'Peter') , ('email', ''), ('color', 'red'))} , vous devez maintenant reconstruire les dictionnaires.


0 commentaires

0
votes

Ce n'est pas vraiment une question Django, mais une question Python générale.

Vous ne pouvez pas utiliser un set pour obtenir des membres uniques de n'importe quel itérable si ces membres ne sont pas hachables.

Un moyen simple consiste à utiliser itertools.groupby en conjonction avec le tri de la liste externe par les valeurs de chaque dict : p >

[{'name': 'Peter', 'email': '', 'color': 'red'}]

Sortie:

a = [{'name': 'Peter', 'email': '', 'color': 'red'},
 {'name': 'Peter', 'email': '', 'color': 'red'},
 {'name': 'Peter', 'email': '', 'color': 'red'}]

from itertools import groupby

uniques = [key for key, _ in groupby(sorted(a, key=lambda d: tuple(d.values())))]

print(uniques)


0 commentaires

0
votes

Vous pouvez également exploiter le fait qu'un dictionnaire ne peut pas répéter les mêmes clés. Plus précisément, vous pouvez utiliser update

arr = [{'name': 'Peter', 'email': '', 'color': 'red'},
       {'name': 'Peter', 'email': '', 'color': 'red'},
       {'name': 'Peter', 'email': '', 'color': 'red'}]

arr1 = {}
for d in arr:
    for k, v in d.items():
        arr1.update({k: v})
print ([arr1])        
# [{'name': 'Peter', 'email': '', 'color': 'red'}]


0 commentaires