我的意图是拥有一个包含唯一字典的列表。为此,我发现使用套装将是一个不错的选择,这就是我一直在尝试的。
以下是我一直在做的事情:
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然后添加集合。
答案 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'}]
希望这对您的项目有所帮助: - )
感谢@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}
字典按任意顺序排列,因此对它进行排序可确保元组始终相同。