如何从一个词典列表中创建一组词典?
示例:
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:当一个词典在结构上相同时,它们与另一个词典相同。这意味着,他们完全相同的键和相同的值(递归)
答案 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