繁体   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