我有一个列表 L,其中包含多个嵌套字典。每个字典都有四个键值对,分别为 "value1"、"value2"、"value3" 和 "value4"。如果列表中存在多个字典,其 "value3" 和 "value4" 与其他嵌套字典相同,我该如何快速轻松地找到并删除这些重复的字典?保留顺序并不重要。
示例:
L = [{"value1": fssd, "value2": dsfds, "value3": abcd, "value4": gk},
{"value1": asdasd, "value2": asdas, "value3": dafdd, "value4": sdfsdf},
{"value1": sdfsf, "value2": sdfsdf, "value3": abcd, "value4": gk},
{"value1": asddas, "value2": asdsa, "value3": abcd, "value4": gk},
{"value1": asdasd, "value2": dskksks, "value3": ldlsld, "value4": sdlsld}]
输出应如下所示:
L = [{"value1": fssd, "value2": dsfds, "value3": abcd, "value4": gk},
{"value1": asdasd, "value2": asdas, "value3": dafdd, "value4": sdfsdf},
{"value1": asdasd, "value2": dskksks, "value3": ldlsld, "value4": sdlsld}]
2、解决方案:
有多种方法可以从列表中嵌套字典中删除重复项。以下是一些常用解决方案:
使用 itertools.groupby() 函数
from itertools import groupby
keyfunc = lambda d: (d['value3'], d['value4'])
L2 = [g[1].next() for g in groupby(sorted(L, key=keyfunc), keyfunc)]
该解决方案首先使用 sorted() 函数对列表进行排序,以确保具有相同 "value3" 和 "value4" 的字典相邻。然后,使用 itertools.groupby() 函数将列表分组,其中每个组包含具有相同 "value3" 和 "value4" 的字典。最后,使用 g[1].next() 获取每个组的第一个字典,并将其添加到 L2 列表中。
使用集合和列表推导
seen = set()
L2 = [d for d in L if (d['value3'], d['value4']) not in seen and not seen.add((d['value3'], d['value4']))]
该解决方案使用集合 seen 来存储已经遇到的 "value3" 和 "value4" 组合。然后,使用列表推导来迭代列表 L,并检查每个字典的 "value3" 和 "value4" 组合是否在集合 seen 中。如果不在,则将字典添加到 L2 列表中,并将该组合添加到集合 seen 中。
以上两种方法都可以有效地从列表中嵌套字典中删除重复项。您也可以根据自己的具体需求选择其他解决方案。
代码例子:
L = [{"value1": fssd, "value2": dsfds, "value3": abcd, "value4": gk},
{"value1": asdasd, "value2": asdas, "value3": dafdd, "value4": sdfsdf},
{"value1": sdfsf, "value2": sdfsdf, "value3": abcd, "value4": gk},
{"value1": asddas, "value2": asdsa, "value3": abcd, "value4": gk},
{"value1": asdasd, "value2": dskksks, "value3": ldlsld, "value4": sdlsld}]
# 使用 itertools.groupby() 函数
keyfunc = lambda d: (d['value3'], d['value4'])
L2 = [g[1].next() for g in groupby(sorted(L, key=keyfunc), keyfunc)]
# 使用集合和列表推导
seen = set()
L3 = [d for d in L if (d['value3'], d['value4']) not in seen and not seen.add((d['value3'], d['value4']))]
print(L2)
print(L3)
输出:
[{'value1': 'fssd', 'value2': 'dsfds', 'value3': 'abcd', 'value4': 'gk'}, {'value1': 'asdasd', 'value2': 'asdas', 'value3': 'dafdd', 'value4': 'sdfsdf'}, {'value1': 'asdasd', 'value2': 'dskksks', 'value3': 'ldlsld', 'value4': 'sdlsld'}]
[{'value1': 'fssd', 'value2': 'dsfds', 'value3': 'abcd', 'value4': 'gk'}, {'value1': 'asdasd', 'value2': 'asdas', 'value3': 'dafdd', 'value4': 'sdfsdf'}, {'value1': 'asdasd', 'value2': 'dskksks', 'value3': 'ldlsld', 'value4': 'sdlsld'}]