如何形成一组词典

时间:2016-05-05 04:49:24

标签: python dictionary data-structures set

我的意图是拥有一个包含唯一字典的列表。为此,我发现使用套装将是一个不错的选择,这就是我一直在尝试的。

以下是我一直在做的事情:

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)

这是输出

{'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

由于我们无法将字典对象存储在集合中,因此我首先使用json.dumps将元素转换为字符串。基本上设置是单一化我的字典元素。如何将字典元素存储在集合中。我知道我们不能将dict对象存储在一个集合中,因此我将它们转换为字符串1st然后添加集合。

3 个答案:

答案 0 :(得分:5)

我认为您必须转换为 frozenset 项目:

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

或使用已排序的元组:

>>> [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()为您提供键/值对的列表。
  • 我们转换为 frozenset ,它是可以使用的,并使用无序比较。
  • 或者,我们将列表转换为元组,因为它是可清除的并对输入进行排序,因为在dict项目无序时排序了元组比较。
  • set()消除了重复的条目。
  • dict()将元组的元组转换回字典。

希望这对您的项目有所帮助: - )

感谢@niemmi提醒我 frozenset()在这里工作以及排序元组。

答案 1 :(得分:3)

您可以使用由frozenset个对象组成的set

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

由于frozenset是无序集合,因此您无需担心订购。

答案 2 :(得分:1)

元组的元组应该像这样工作:

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

编辑:

正如@Raymond建议的那样,也许首先对元组进行排序就像是一个聪明的主意。

>>> myset = {tuple(sorted(d.items())) for d in mylist}

字典按任意顺序排列,因此对它进行排序可确保元组始终相同。