从字典列表中删除对特定键共享相同值(优先于最新键)的字典

时间:2020-05-01 10:05:52

标签: python

我有下面的词典列表:

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中执行此操作的最佳方法是什么?

2 个答案:

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