我有下面的词典列表:
mylist = [{'color': 'red', 'size': 'small', 'pattern': 'striped', 'id': '10'},
{'color': 'red', 'size': 'small', 'pattern': 'spotted', 'id': '11'},
{'color': 'red', 'size': 'large', 'pattern': 'striped', 'id': '12'},
{'color': 'red', 'size': 'small', 'pattern': 'spotted', 'id': '13'},
{'color': 'blue', 'size': 'medium', 'pattern': 'spotted', 'id': '14'}]
我想删除ID键值最低的字典(仅保留最新的字典),而这些键的color和size键值都相同。所以在这种情况下,我想结束:
result = [{'color': 'red', 'size': 'large', 'pattern': 'striped', 'id': '12'},
{'color': 'red', 'size': 'small', 'pattern': 'spotted', 'id': '13'},
{'color': 'blue', 'size': 'medium', 'pattern': 'spotted', 'id': '14'}]
在python中执行此操作的最佳方法是什么?
答案 0 :(得分:1)
使用排序和分组依据
sorted_list = sorted(mylist, key=lambda d: (d['color'], d['size'], int(d['id'])))
result = [list(v)[-1] for k, v in groupby(sorted_list, lambda d: (d['color'], d['size']))]
结果
[{'color': 'blue', 'id': '14', 'pattern': 'spotted', 'size': 'medium'},
{'color': 'red', 'id': '12', 'pattern': 'striped', 'size': 'large'},
{'color': 'red', 'id': '13', 'pattern': 'spotted', 'size': 'small'}]
说明
对元素进行排序,因此具有相同颜色和大小的字典是连续的,并且按id升序排列
sorted_list = sorted(mylist, key=lambda d: (d['color'], d['size'], int(d['id'])))
按大小和颜色分组排序的字典
for k, v in groupby(sorted_list, lambda d: (d['color'], d['size']))
每个组中的字典按ID升序排列。
获取每个组的最后一个元素
result = [list(v)[-1] for k, v in groupby(...)]
答案 1 :(得分:0)
您可以建立一个以元组(颜色,大小)为键,而字典为值的中间字典,并在遇到新的(颜色,大小)组合或现有组合的更高ID时对其进行更新。
最后,您想要的输出只是其值的列表。
mylist = [{'color': 'red', 'size': 'small', 'pattern': 'striped', 'id': '10'},
{'color': 'red', 'size': 'large', 'pattern': 'striped', 'id': '11'},
{'color': 'red', 'size': 'small', 'pattern': 'spotted', 'id': '12'},
{'color': 'blue', 'size': 'medium', 'pattern': 'spotted', 'id': '13'}]
by_color_and_size = {}
for d in mylist:
key = (d['color'], d['size'])
if (key not in by_color_and_size
or int(d['id']) > int(by_color_and_size[key]['id'])):
by_color_and_size[key] = d
out = list(by_color_and_size.values())
print(out)
# [{'color': 'red', 'size': 'small', 'pattern': 'spotted', 'id': '12'},
# {'color': 'red', 'size': 'large', 'pattern': 'striped', 'id': '11'},
# {'color': 'blue', 'size': 'medium', 'pattern': 'spotted', 'id': '13'}]