基于多个键的独特字典

时间:2016-08-29 09:17:20

标签: python dictionary

我有一个不同“类型”的词典 - >修改和删除。 我想要做到这一点。

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': ''}}}
]

为了获得一个独特的列表,我这样做:

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'}} 
]

如何根据“几把钥匙”获得一份独特的清单。

我需要两种'类型'。我的预期结果是:

[
{'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'}}
]

1 个答案:

答案 0 :(得分:1)

我不确定我是否明白你的问题,但是,这就是你想要的吗?

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"])