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

时间:2016-06-08 14:48:42

标签: python list python-3.x dictionary python-2.x

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

换句话说:如果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'}]

结果应如下所示:

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

2 个答案:

答案 0 :(得分:4)

使用另一个词典将列表中的词典映射到实际词典,而不用“忽略”键。这样,每种类型中只保留一种。当然,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())

结果是:

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

答案 1 :(得分:2)

我自己的解决方案(可能不是最好的,但它有效):

#logo {
    max-width: 100%;
    height: 100%;
    overflow: hidden;
}
#logo img {
    left: 0;
    top: 0;
    bottom: 0;
    margin-left: auto;
    margin-right: auto;
    max-width: 100%;
    max-height: 100%;
}

其中

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) 是可能重复的原始列表,

src_list是最终的无重复列表,

dst_list是唯一键