A10*_*010 5 python dictionary set
我有一个字典列表,但其中一些是重复的,我想删除它们(重复项)。
字典的键是一个连续的数字。
示例如下:
[{1: {a:[1,2,3], b: 4}},
{2: {a:[4,5,6], d: 5}},
{3: {a:[1,2,3], b: 4}},
.....,
{1000: {a:[2,5,1], b: 99}},
]
Run Code Online (Sandbox Code Playgroud)
考虑到前面的例子我想获得:
[{1: {a:[1,2,3], b: 4}},
{2: {a:[4,5,6], d: 5}},
.....,
{1000: {a:[2,5,1], b: 99}},
]
Run Code Online (Sandbox Code Playgroud)
事实上,键 1 和键 3 的字典的值是相同的。
我尝试使用一组,但由于 dict 是不可散列的类型,我无法这样做。
我该如何解决这个问题?
编辑
就我而言,字典中的项目数量不固定,所以我可以:
[{1: {a:[1,2,3], b: 4}},
{2: {a:[4,5,6], d: 5}},
.....,
{1000: {a:[2,5,1], b: 99, c:["a","v"]}},
]
Run Code Online (Sandbox Code Playgroud)
其中键为 100 的字典包含三个元素,其中两个元素如图所示。
为了解决@jdehesa解决方案的限制,where[1, 2]将被视为重复项,您可以通过使用而不是序列化数据结构来(1, 2)保留数据类型。pprint.pformat由于pprint.pformat按键对字典进行排序并按项目对集合进行排序,{1: 2, 3: 4}因此将被正确地视为与 相同{3: 4, 1: 2},但[1, 2]不会被视为与 重复(1, 2):
from pprint import pformat
lst = [
{1: {'a': [1, 2, 3], 'b': 4}},
{2: {'a': [4, 5, 6], 'd': 5}},
{3: {'b': 4, 'a': [1, 2, 3]}},
{4: {'a': (4, 5, 6), 'd': 5}},
]
seen = set()
output = []
for d in lst:
for k, v in d.items():
signature = pformat(v)
if signature not in seen:
seen.add(signature)
output.append({k: v})
Run Code Online (Sandbox Code Playgroud)
output变成:
[{1: {'a': [1, 2, 3], 'b': 4}},
{2: {'a': [4, 5, 6], 'd': 5}},
{4: {'a': (4, 5, 6), 'd': 5}}]
Run Code Online (Sandbox Code Playgroud)