簡體   English   中英

從字典列表中刪除重復項(具有唯一值)

[英]Remove duplicates from the list of dictionaries (with a unique value)

我有一個字典列表,每個字典描述一個文件(文件格式,文件名,文件大小,...和文件的完整路徑[ 始終唯一 ])。 目標是排除描述同一文件副本的所有字典 (我只想要每個文件有一個字典(條目),無論有多少副本。

換句話說:如果2個(或更多)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'}]

結果應如下所示:

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

使用另一個字典將列表中的字典映射到實際字典而不使用“忽略”鍵。 這樣,每種類型中只保留一種。 當然,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'}]

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

    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是最終的無重復列表,

path是唯一的密鑰

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM