[英]Remove all elements from list of dictionaries with one (key, value) repeated
i have this list of dictionaries, and i want to remove those dictionaries with same genre until have only one, for example if i have two dictionaries with same genre ( Kids) i want only the first one, and the others, should be removed. 我有此字典列表,我想删除那些具有相同体裁的字典,直到只有一个,例如,如果我有两个具有相同体裁的字典(儿童),我只希望删除第一个,而其他则应删除。
Source 资源
[
{'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'}
]
Output: 输出:
[
{'genre': 'Kids', 'jpg': 'as.jpg', 'file': '01-26'},
{'genre': 'Action', 'jpg': 'na.jpg', 'file': '01-41'},
{'genre': 'Drama', 'jpg': 'do.jpg', 'file': '01-54'}
]
You could do: 您可以这样做:
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)
Output 输出量
[{'file': '01-26', 'jpg': 'as.jpg', 'genre': 'Kids'}, {'file': '01-41', 'jpg': 'na.jpg', 'genre': 'Action'}, {'file': '01-54', 'jpg': 'do.jpg', 'genre': 'Drama'}]
Suppose your list is l
. 假设您的清单是l
。 Just scan the list by the end, and stock items in a dictionary with genre
as keys. 只需扫描列表的末尾,然后将genre
为键的字典中的项目存储在字典中即可。 Only the first of each genre will stay, hiding the others. 每个类型中只有第一个类型会保留,其他类型则隐藏。 Then you just have to drop the key, keeping the values. 然后,您只需要放下键并保留值即可。
stock = {d['genre']:d for d in reversed (l)}
print( [v for v in stock.values()] )
result: 结果:
[{'genre': 'Drama', 'jpg': 'do.jpg', 'file': '01-54'},
{'genre': 'Action', 'jpg': 'na.jpg', 'file': '01-41'},
{'genre': 'Kids', 'jpg': 'as.jpg', 'file': '01-26'}]
As usual there are multiple ways: 与往常一样,有多种方法:
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'}
]
Here the solution posted before as a function: 这里将解决方案作为函数发布:
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
And here a long-ish concatenation of lists: 这是一个长长的列表串联:
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
And a test: 并进行测试:
filter_key = 'genre'
print(filter1(data, by=filter_key))
print(filter2(data, by=filter_key))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.