saromba
saromba

Reputation: 498

Unique dictionary on basis of multiple keys

I have a dict with different "types" -> modified and deleted. I want do unique this.

myDict = 
[
{'type': 'deleted', 'target': {'id': u'1', 'foo': {'value': ''}}},
{'type': 'modified', 'target': {'id': u'1', 'foo': {'value': ''}}},
{'type': 'deleted', 'target': {'id': u'1', 'foo': {'value': ''}}},

{'type': 'deleted', 'target': {'id': u'2', 'foo': {'value': ''}}},
{'type': 'deleted', 'target': {'id': u'2', 'foo': {'value': ''}}},
{'type': 'deleted', 'target': {'id': u'2', 'foo': {'value': ''}}},

{'type': 'deleted', 'target': {'id': u'3', 'foo': {'value': ''}}},
{'type': 'modified', 'target': {'id': u'3', 'foo': {'value': ''}}},
{'type': 'deleted', 'target': {'id': u'3', 'foo': {'value': ''}}}
]

To achieve a unique list I do this:

dict((v['target']['id'],v) for v in myDict).values()

[
{'type': 'deleted', 'target': {'foo': {'value': ''}, 'id': u'1'}}, 
{'type': 'deleted', 'target': {'foo': {'value': ''}, 'id': u'2'}},
{'type': 'deleted', 'target': {'foo': {'value': ''}, 'id': u'3'}} 
]

How can I get a unique list on the basis of a "couple of keys".

I need both 'types'. My expected result is:

[
{'type': 'deleted', 'target': {'foo': {'value': ''}, 'id': u'1'}}, 
{'type': 'modified', 'target': {'foo': {'value': ''}, 'id': u'1'}},

{'type': 'deleted', 'target': {'foo': {'value': ''}, 'id': u'2'}},
{'type': 'modified', 'target': {'foo': {'value': ''}, 'id': u'2'}},

{'type': 'deleted', 'target': {'foo': {'value': ''}, 'id': u'3'}}
]

Upvotes: 0

Views: 50

Answers (1)

BPL
BPL

Reputation: 9863

Not sure I've understood your question, but, is this what you want?

from collections import defaultdict
import json

my_list = [
    {'type': 'deleted', 'target': {'id': u'1', 'foo': {'value': ''}}},
    {'type': 'modified', 'target': {'id': u'1', 'foo': {'value': ''}}},
    {'type': 'deleted', 'target': {'id': u'1', 'foo': {'value': ''}}},

    {'type': 'deleted', 'target': {'id': u'2', 'foo': {'value': ''}}},
    {'type': 'deleted', 'target': {'id': u'2', 'foo': {'value': ''}}},
    {'type': 'deleted', 'target': {'id': u'2', 'foo': {'value': ''}}},

    {'type': 'deleted', 'target': {'id': u'3', 'foo': {'value': ''}}},
    {'type': 'modified', 'target': {'id': u'3', 'foo': {'value': ''}}},
    {'type': 'deleted', 'target': {'id': u'3', 'foo': {'value': ''}}}
]

out = defaultdict(set)

for v in my_list:
    out[v["type"]].add(json.dumps(v["target"], sort_keys=True))

result = []
for k, v in out.iteritems():
    for vv in out[k]:
        result.append({
            "type": k,
            "target": json.loads(vv)
        })

print out
print len(out["deleted"])
print len(out["modified"])

Upvotes: 1

Related Questions