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

Vas*_*ily 4 python dictionary list python-2.x python-3.x

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

换句话说:如果 2 个(或更多)dicts 仅在一个键(即 path)中不同 - 只留下其中一个)。

例如,这里是源列表:

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'}]
Run Code Online (Sandbox Code Playgroud)

结果应如下所示:

dst_list = [{'filename': 'abc', 'filetype': '.txt', ... 'path': 'C:/'},
            {'filename': 'def', 'filetype': '.zip', ... 'path': 'C:/mydir2'}]
Run Code Online (Sandbox Code Playgroud)

tob*_*s_k 6

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

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())
Run Code Online (Sandbox Code Playgroud)

结果是:

[{'path': 'C:/mydir', 'filetype': '.txt', 'filename': 'abc'}, 
 {'path': 'C:/mydir2', 'filetype': '.zip', 'filename': 'def'}]
Run Code Online (Sandbox Code Playgroud)