将词典列表转换为一组词典

时间:2016-08-29 10:02:06

标签: python dictionary

如何从一个词典列表中创建一组词典?

示例:

import copy

v1 = {'k01': 'v01', 'k02': {'k03': 'v03', 'k04': {'k05': 'v05'}}}
v2 = {'k11': 'v11', 'k12': {'k13': 'v13', 'k14': {'k15': 'v15'}}}

data = []
N = 5
for i in range(N):
    data.append(copy.deepcopy(v1))
    data.append(copy.deepcopy(v2))

print data

如何从列表data创建一组词典?

NS:当一个词典在结构上相同时,它们与另一个词典相同。这意味着,他们完全相同的键和相同的值(递归)

3 个答案:

答案 0 :(得分:4)

一个廉价的解决方法是序列化你的dicts,例如:

import json

dset = set()

d1 = {'a':1, 'b':{'c':2}}
d2 = {'b':{'c':2}, 'a':1} # the same according to your definition
d3 = {'x': 42}

dset.add(json.dumps(d1, sort_keys=True))
dset.add(json.dumps(d2, sort_keys=True))
dset.add(json.dumps(d3, sort_keys=True))

for p in dset:
    print json.loads(p) 

从长远来看,将整个事物包装在像SetOfDicts这样的类中是有意义的。

答案 1 :(得分:0)

字典是可变的,因此在python中不可用。

您可以使用__hash__方法创建dict-subclass。确保字典的哈希值在集合中不会发生变化(这可能意味着您无法修改成员)。 有关frozendicts的示例实现,请参阅http://code.activestate.com/recipes/414283-frozen-dictionaries/

如果您可以在(冻结的)词典上定义排序顺序,则可以使用基于二叉树而不是集合的数据结构。这归结为以下链接中提供的bisect解决方案。

另请参阅https://stackoverflow.com/a/18824158/5069869,了解为什么没有哈希的集合没有意义。

答案 2 :(得分:0)

也不完全是您所要查找的内容,因为它也是列表的原因,但是:

def hashable_structure(structure):
    if isinstance(structure, dict):
        return {k: hashable_structure(v) for k, v in structure.items()}
    elif isinstance(structure, list):
        return {hashable_structure(elem) for elem in structure)}
    else:
        return structure