Python 从字典列表中删除重复项(具有唯一值)

Python 从字典列表中删除重复项(具有唯一值),python,list,python-3.x,dictionary,python-2.x,Python,List,Python 3.x,Dictionary,Python 2.x,我有一个字典列表,每个字典都描述了一个文件(文件格式、文件名、文件大小……以及文件的完整路径[始终唯一)。我们的目标是排除所有描述同一文件副本的词典(我只希望每个文件有一个dict(条目),不管有多少副本) 换句话说:如果两个(或更多)DICT仅在一个键(即路径)上不同,则只保留其中一个键) 例如,以下是源列表: src_list = [{'filename': 'abc', 'filetype': '.txt', ... 'path': 'C:/'}, {'filena

我有一个字典列表,每个字典都描述了一个文件(文件格式、文件名、文件大小……以及文件的完整路径[始终唯一)。我们的目标是排除所有描述同一文件副本的词典(我只希望每个文件有一个dict(条目),不管有多少副本)

换句话说:如果两个(或更多)DICT仅在一个键(即路径)上不同,则只保留其中一个键)

例如,以下是源列表:

src_list = [{'filename': 'abc', 'filetype': '.txt', ... 'path': 'C:/'},
            {'filename': 'abc', 'filetype': '.txt', ... 'path': 'C:/mydir'},
            {'filename': 'def', 'filetype': '.zip', ... 'path': 'C:/'},
            {'filename': 'def', 'filetype': '.zip', ... 'path': 'C:/mydir2'}]
结果应该如下所示:

dst_list = [{'filename': 'abc', 'filetype': '.txt', ... 'path': 'C:/'},
            {'filename': 'def', 'filetype': '.zip', ... 'path': 'C:/mydir2'}]

使用另一个字典将列表中没有“忽略”键的字典映射到实际字典。这样,每种类型只保留一个。当然,dict是不可散列的,因此必须使用(排序的)元组

src_list = [{'filename': 'abc', 'filetype': '.txt', 'path': 'C:/'},
            {'filename': 'abc', 'filetype': '.txt', 'path': 'C:/mydir'},
            {'filename': 'def', 'filetype': '.zip', 'path': 'C:/'},
            {'filename': 'def', 'filetype': '.zip', 'path': 'C:/mydir2'}]
ignored_keys = ["path"]
filtered = {tuple((k, d[k]) for k in sorted(d) if k not in ignored_keys): d for d in src_list}
dst_lst = list(filtered.values())
结果是:

[{'path': 'C:/mydir', 'filetype': '.txt', 'filename': 'abc'}, 
 {'path': 'C:/mydir2', 'filetype': '.zip', 'filename': 'def'}]
我自己的解决方案(也许不是最好的,但它奏效了):

在哪里

src_list
是原始列表,可能有重复项

dst_列表
是最终的无重复列表


path
是标记问题的唯一键

Dupe。查看已接受的答案,并在SEED或SEED_add(x['key1'])中使用
x['key1'])
来解决您的问题为什么要放弃此选项
{'key1':'non_unique_value2','key2':'unique_value3'}
键和值的元组应该添加到
中,而不仅仅是值。@Suzana_K,你为什么这么认为?我想你会找到你问题的答案
    dst_list = []
    seen_items = set()
    for dictionary in src_list:
        # here we cut the unique key (path) out to add it back later after a duplicate check
        path = dictionary.pop('path', None)
        t = tuple(dictionary.items())
        if t not in seen_items:
            seen_items.add(t)
            # duplicate-check passed, adding the unique key back to it's dictionry
            dictionary['path'] = path
            dst_list.append(dictionary)

    print(dst_list)