Python根据值从字典列表中删除重复项
我有一份字典清单Python根据值从字典列表中删除重复项,python,list,dictionary,Python,List,Dictionary,我有一份字典清单 vals = [ {'tmpl_id': 67, 'qty_available': -3.0, 'product_id': 72, 'product_qty': 1.0}, {'tmpl_id': 67, 'qty_available': 5.0, 'product_id': 71, 'product_qty': 1.0} {'tmpl_id': 69, 'qty_available': 10.0, 'pro
vals = [
{'tmpl_id': 67, 'qty_available': -3.0, 'product_id': 72, 'product_qty': 1.0},
{'tmpl_id': 67, 'qty_available': 5.0, 'product_id': 71, 'product_qty': 1.0}
{'tmpl_id': 69, 'qty_available': 10.0, 'product_id': 74, 'product_qty': 1.0}
]
from operator import itemgetter
getvals = operator.itemgetter('tmpl_id')
val.sort(key=getvals)
result = []
for k, g in itertools.groupby(val, getvals):
result.append(g.next())
val[:] = result
我想删除重复的值(tmpl_id),并且还基于可用数量小于或为负
输出如下所示:
vals = [
{'tmpl_id': 67, 'qty_available': 5.0, 'product_id': 71, 'product_qty': 1.0}
{'tmpl_id': 69, 'qty_available': 10.0, 'product_id': 74, 'product_qty': 1.0}
]
您可以使用
“tmpl\u id”
中的值作为键来存储dict,将dict设置为值,如果您得到的dict具有更高的“可用数量”
,则用当前dict替换:
def remove_dupes(l, k, k2):
seen = {}
for d in vals:
v, v2 = d[k], d[k2]
if v not in seen:
seen[v] = d
elif v2 > seen[v][k2]:
seen[v] = d
return seen
vals[:] = remove_dupes(vals, "tmpl_id",'qty_available' ).values()
输出:
[{'product_id': 71, 'qty_available': 5.0, 'tmpl_id': 67, 'product_qty': 1.0},
{'product_id': 74, 'qty_available': 10.0, 'tmpl_id': 69, 'product_qty': 1.0}]
如果要使用sorted和groupby,只需反向排序并从每个v中获取第一个值:
from itertools import groupby
from operator import itemgetter
keys = itemgetter("tmpl_id",'qty_available')
vals[:] = (next(v) for k,v in groupby(sorted(vals, key=keys,reverse=True),
key=itemgetter("tmpl_id")))
print(vals)
反向排序将意味着较高的'qty\u available'
将排在第一位,因此对于唯一的dict,它只会给您该dict,对于重复的tmpl\u id,您将得到qty\u available'值最大的dict
如果您想要就地排序而不是创建新列表,只需使用
vals.sort()
并删除对排序的调用,您应该显示您尝试过的内容,并说出您现在遇到的问题。如果你能表现出自己的努力,人们会给你更多的帮助……请阅读以下内容:数据是否按“可用数量”排序:
?@SergeBallestav-questionupdated@PadraicCunningham不,我只是用它来测试数据
from itertools import groupby
from operator import itemgetter
keys = itemgetter("tmpl_id",'qty_available')
vals[:] = (next(v) for k,v in groupby(sorted(vals, key=keys,reverse=True),
key=itemgetter("tmpl_id")))
print(vals)