2016-05-05 12 views
0

Meine Absicht ist, eine Liste mit einzigartigen Wörterbüchern zu haben. Dafür habe ich herausgefunden, dass die Verwendung von Sets eine gute Option ist und hier ist, was ich versucht habe. HierWie man einen Satz Wörterbücher bildet

ist, was ich getan habe:

import json 
mylist = [{'id':1,'name':'john', 'age':34},{'id':1,'name':'john', 'age':34},{'id':2,'name':'hanna', 'age':30}] 
print(mylist[0]) 
myset = set(json.dumps(mylist[0])) 
print(myset) 

Und hier ist der Ausgang

{'id': 1, 'age': 34, 'name': 'john'} #actual dictionary element 
{'e', 'j', 'h', 'i', ':', '"', 'o', '3', 'n', 'a', '}', '4', ' ', ',', 'm', 'g', '{', '1', 'd'} #dictionary element in set 

Da wir keine Dictionary-Objekte in Sets speichern kann ich die Elemente Zeichenfolge am Umwandeln einer ersten json mit .dumps. Grundlegend ist die Vereinheitlichung meiner Wörterbuchelemente. Wie kann ich Wörterbuchelemente in einem Set speichern? Ich verstehe, dass wir dict-Objekte nicht in einem Satz speichern können, daher konvertiere ich sie in String 1st und dann in Set.

+0

Ich habe keine Ahnung, was Sie versuchen und warum. – TigerhawkT3

+0

Warum nennen Sie 'json.dumps'? – kennytm

+0

Da wir keine Wörterbücher in der Gruppe speichern können, wandle ich das Wörterbuch in die Zeichenfolge mit json.dumps um. Und was ich versuche zu erreichen, ist, ich habe eine Liste von 100 Wörterbüchern und möchte eine einzigartige Liste von Elementen bekommen. Also dachte ich, Sets wären effizient. – aaj

Antwort

1

Ein Tupel von Tupeln sollte wie so funktionieren:

>>> mylist = [{'id':1,'name':'john', 'age':34},{'id':1,'name':'john', 'age':34}, 
{'id':2,'name':'hanna', 'age':30}] 
>>> myset = {tuple(d.items()) for d in mylist} 
>>> myset 
{(('name', 'hanna'), ('id', 2), ('age', 30)), (('name', 'john'), ('id', 1), ('age', 34))} 

# Converting back to dictionary 
>>> [dict(i) for i in myset] 
[{'name': 'hanna', 'id': 2, 'age': 30}, {'name': 'john', 'id': 1, 'age': 34}] 

EDIT:

Wie @Raymond vorschlagen, vielleicht zuerst die Tupeln Sortierung wie so eine gute Idee wäre.

Wörterbücher sind in beliebiger Reihenfolge, so dass die Sortierung dafür sorgt, dass die Tupel immer gleich sind.

5

Ich denke, man entweder auf eine frozenset zu konvertieren der Objekte:

>>> list(map(dict, set(frozenset(d.items()) for d in mylist))) 
[{'age': 30, 'id': 2, 'name': 'hanna'}, {'age': 34, 'id': 1, 'name': 'john'}] 

oder eine sortierte Tupel von Elementen verwenden:

>>> [dict(t) for t in set([tuple(sorted(d.items())) for d in mylist])] 
[{'age': 30, 'id': 2, 'name': 'hanna'}, {'age': 34, 'id': 1, 'name': 'john'}] 
  • dict.items() gibt Ihnen eine Liste von Schlüssel/Wert-Paaren.
  • Wir konvertieren zu einem Frozenset, das ist waschbar und verwendet einen ungeordneten Vergleich.
  • Alternativ konvertieren wir die Liste in ein Tupel, weil es hashbar ist und die Eingabe sortiert, weil Tupel Vergleich bestellt wird, während dict Elemente ungeordnet sind.
  • set() beseitigt die doppelten Einträge.
  • dict() konvertiert das Tupel-Tupel zurück in ein Wörterbuch.

hoffe, das hilft mit Ihrem Projekt :-)

Dank für die Erinnerung an @niemmi dass frozenset() hier sowie sortiert Tupeln funktioniert.

3

könnten Sie set verwenden, die aus frozenset Objekte:

>>> c = set(frozenset(d.items()) for d in mylist) 
>>> c 
set([frozenset([('age', 30), ('id', 2), ('name', 'hanna')]), frozenset([('id', 1), ('name', 'john'), ('age', 34)])]) 

# Converting back 
>>> [dict(x) for x in c] 
[{'age': 30, 'id': 2, 'name': 'hanna'}, {'age': 34, 'id': 1, 'name': 'john'}] 

Seit frozenset ungeordnete Sammlung müssen Sie sich nicht um die Bestellung kümmern.

Verwandte Themen