从字典列表中删除所有元素,并重复一个(键,值)

时间:2018-11-26 21:14:26

标签: python list dictionary

我有此词典的列表,我想删除那些具有相同体裁的词典,直到只有一个,例如,如果我有两个具有相同体裁的词典(儿童),我只希望第一个词典,而其他则应被删除。


来源

[
     {'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'}
]

3 个答案:

答案 0 :(得分:2)

您可以这样做:

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'}]

答案 1 :(得分:0)

假设您的列表为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'}]

答案 2 :(得分:0)

通常有多种方法:

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))