簡體   English   中英

從字典列表中刪除所有元素,並重復一個(鍵,值)

[英]Remove all elements from list of dictionaries with one (key, value) repeated

我有此字典列表,我想刪除那些具有相同體裁的字典,直到只有一個,例如,如果我有兩個具有相同體裁的字典(兒童),我只希望刪除第一個,而其他則應刪除。


資源

[
     {'genre': 'Kids', 'jpg': 'as.jpg', 'file': '01-26'},
     {'genre': 'Kids', 'jpg': 'la.jpg', 'file': '02-02'},
     {'genre': 'Action', 'jpg': 'na.jpg', 'file': '01-41'},
     {'genre': 'Action', 'jpg': 'lo.jpg', 'file': '00-17'}, 
     {'genre': 'Drama', 'jpg': 'do.jpg', 'file': '01-54'}
]

輸出:

[
     {'genre': 'Kids', 'jpg': 'as.jpg', 'file': '01-26'},
     {'genre': 'Action', 'jpg': 'na.jpg', 'file': '01-41'},
     {'genre': 'Drama', 'jpg': 'do.jpg', 'file': '01-54'}
]

您可以這樣做:

data = [
     {'genre': 'Kids', 'jpg': 'as.jpg', 'file': '01-26'},
     {'genre': 'Kids', 'jpg': 'la.jpg', 'file': '02-02'},
     {'genre': 'Action', 'jpg': 'na.jpg', 'file': '01-41'},
     {'genre': 'Action', 'jpg': 'lo.jpg', 'file': '00-17'},
     {'genre': 'Drama', 'jpg': 'do.jpg', 'file': '01-54'}
]


seen = set()
result = []
for e in data:
    if e['genre'] not in seen:
        seen.add(e['genre'])
        result.append(e)

print(result)

輸出量

[{'file': '01-26', 'jpg': 'as.jpg', 'genre': 'Kids'}, {'file': '01-41', 'jpg': 'na.jpg', 'genre': 'Action'}, {'file': '01-54', 'jpg': 'do.jpg', 'genre': 'Drama'}]

假設您的清單是l 只需掃描列表的末尾,然后將genre為鍵的字典中的項目存儲在字典中即可。 每個類型中只有第一個類型會保留,其他類型則隱藏。 然后,您只需要放下鍵並保留值即可。

stock = {d['genre']:d for d in reversed (l)}
print( [v for v in stock.values()] )

結果:

[{'genre': 'Drama', 'jpg': 'do.jpg', 'file': '01-54'}, 
{'genre': 'Action', 'jpg': 'na.jpg', 'file': '01-41'}, 
{'genre': 'Kids', 'jpg': 'as.jpg', 'file': '01-26'}]

與往常一樣,有多種方法:

data = [
 {'genre': 'Kids', 'jpg': 'as.jpg', 'file': '01-26'},
 {'genre': 'Kids', 'jpg': 'la.jpg', 'file': '02-02'},
 {'genre': 'Action', 'jpg': 'na.jpg', 'file': '01-41'},
 {'genre': 'Action', 'jpg': 'lo.jpg', 'file': '00-17'}, 
 {'genre': 'Drama', 'jpg': 'do.jpg', 'file': '01-54'}
]

這里將解決方案作為函數發布:

def filter1(dict_list, by='grenre'):
    seen   = []
    result = []
    for e in dict_list:
        if e[by] not in seen:
            seen.append(e[by])
            result.append(e)
    return result

這是一個長長的列表串聯:

def filter2(dict_list, by='grenre'):
    result = [[e for e in dict_list if e[by]==key][0] for key in set([e[by] for e in dict_list])]
    return result

並進行測試:

filter_key = 'genre'
print(filter1(data, by=filter_key))
print(filter2(data, by=filter_key))

暫無
暫無

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

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