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)