如何从列表中选择唯一的嵌套词典

时间:2019-12-06 15:36:28

标签: python python-3.x dictionary

我有一个列表,其中包含字典:

lst = [
{'a':{'a1':1,'a2':2},
'b':{'b1':1,'b2':2},
'c':{'c1':1,'c2':2}},

{'a':{'a2':2,'a1':1},
'b':{'b1':1,'b2':2},
'c':{'c1':1,'c2':2}},

{'a':{'a1':1,'a2':2},
'b':{'bb1':11,'bb2':22},
'c':{'c1':1,'c2':2}},

{'b':{'b1':1,'b2':2},
'a':{'a1':1,'a2':2},
'c':{'c1':1,'c2':2}},

{'a':{'a1':1,'a2':2},
'b':{'b1':1,'b2':2}}]

我只想选择唯一的键(这意味着它们具有相同的键和值名称以及相同数量的键和值,但是如果某些字典相同,但是键值的顺序不同,则它们相同类型)。 因此输出必须是这样的:

[
{'a':{'a1':1,'a2':2},
'b':{'b1':1,'b2':2},
'c':{'c1':1,'c2':2}},

{'a':{'a1':1,'a2':2},
'b':{'bb1':11,'bb2':22},
'c':{'c1':1,'c2':2}},

{'a':{'a1':1,'a2':2},
'b':{'b1':1,'b2':2}}]

我该怎么办?

3 个答案:

答案 0 :(得分:1)

您可以将字典转换为字符串,将其添加到集合中,然后解析并将其再次转换为列表。

import json 

s = set(json.dumps(i, sort_keys=True) for i in lst)

unique_list = [json.loads(n) for n in list(s)]

答案 1 :(得分:0)

可能具有列表理解功能:

print ([i for n, i in enumerate(lst) if i not in lst[n + 1:]])

答案 2 :(得分:0)

您可以执行以下操作:

lst = [
{'a':{'a1':1,'a2':2},
'b':{'b1':1,'b2':2},
'c':{'c1':1,'c2':2}},

{'a':{'a2':2,'a1':1},
'b':{'b1':1,'b2':2},
'c':{'c1':1,'c2':2}},

{'a':{'a1':1,'a2':2},
'b':{'bb1':11,'bb2':22},
'c':{'c1':1,'c2':2}},

{'b':{'b1':1,'b2':2},
'a':{'a1':1,'a2':2},
'c':{'c1':1,'c2':2}},

{'a':{'a1':1,'a2':2},
'b':{'b1':1,'b2':2}}]


def shared_items(x, y):
    return (cmp(x, y) == 0)


new_lst = []
count = 0
for d1 in lst:
    if not new_lst:
        new_lst.append(d1)
    else:
        count = len(new_lst)
        for d2 in new_lst:
            if not shared_items(d1, d2):
                count -= 1
        if count == 0:
            new_lst.append(d1)

for elem in new_lst:
    print(elem)

输出将是:

{'a': {'a1': 1, 'a2': 2}, 'c': {'c2': 2, 'c1': 1}, 'b': {'b1': 1, 'b2': 2}}
{'a': {'a1': 1, 'a2': 2}, 'c': {'c2': 2, 'c1': 1}, 'b': {'bb2': 22, 'bb1': 11}}
{'a': {'a1': 1, 'a2': 2}, 'b': {'b1': 1, 'b2': 2}}

注意 cmp()对python 2和3均有效