比较字典列表中的值,并且仅返回值最高的字典

时间:2020-05-09 19:20:32

标签: python list dictionary

我想返回一个列表,该列表包含列表中字典中给定名称和给定类型的具有最高版本号的字典。我有以下词典列表:

list = [
{
  "name": "name 1",
  "type": "type 1",
  "version": 1,
  }
{ *this one should be returned*
  "name": "name 1",
  "type": "type 1",
  "version": 2,
  }
{
  "name": "name 2",
  "type": "type 1",
  "version": 1,
  }
{ *and this one*
  "name": "name 2",
  "type": "type 1",
  "version": 2,
  }
{
  "name": "name 1",
  "type": "type 2",
  "version": 1,
  }
{ *and this one*
  "name": "name 1",
  "type": "type 2",
  "version": 2,
  }

我希望能够返回一个列表,该列表仅包含类型和名称的最高版本号,因此上面的结果将是:

  returned_list = [
{
  "name": "name 1",
  "type": "type 1",
  "version": 2,
  }
{
  "name": "name 2",
  "type": "type 1",
  "version": 2,
  }
{
  "name": "name 1",
  "type": "type 2",
  "version": 2,
  }

我不确定从哪里开始,任何建议都将不胜感激。

3 个答案:

答案 0 :(得分:2)

这里是一种使用defaultdict来组装以名称,类型对为键且其值是版本号列表的字典的方法,然后将其组装为所需的列表:

from collections import defaultdict

accumulate = defaultdict(list)
for d in my_list:
    accumulate[(d["name"],d["type"])].append(d["version"])

new_list = [{"name":n,"type":t,"version":max(v)} for (n,t),v in accumulate.items()]

结果:

>>> for d in new_list:print(d)

{'name': 'name 1', 'type': 'type 1', 'version': 2}
{'name': 'name 2', 'type': 'type 1', 'version': 2}
{'name': 'name 1', 'type': 'type 2', 'version': 2}

答案 1 :(得分:1)

这是一种方法

首先从输入列表中找到最大值。为此,我们使用max()

然后从原始列表中查找可能具有相同“版本”的所有条目。为此,我们使用filter

name_list = [
    {
        "name": "name 1",
        "type": "type 1",
        "version": 1,
    },
    {
        "name": "name 1",
        "type": "type 1",
        "version": 2,
    },
    {
        "name": "name 2",
        "type": "type 1",
        "version": 1,
    },
    {
        "name": "name 2",
        "type": "type 1",
        "version": 2,
    },
    {
        "name": "name 1",
        "type": "type 2",
        "version": 1,
    },
    {
        "name": "name 1",
        "type": "type 2",
        "version": 2,
    }]

max_in_list = max(name_list, key=lambda x: x['version']) # max by version

maxes_in_list = filter(lambda x: x['version'] == max_in_list['version'], name_list) # select if version == max_version

print(list(maxes_in_list))

输出:

[{'name': 'name 1', 'type': 'type 1', 'version': 2}, {'name': 'name 2', 'type': 'type 1', 'version': 2}, {'name': 'name 1', 'type': 'type 2', 'version': 2}]

答案 2 :(得分:0)

lst = []
comp = list_lst[0]['version']
for i in range(len(list_lst)):
    if (list_lst[i]['version']) > comp:
        comp = list_lst[i]['version']
        lst = []
        lst.append(list_lst[i])
    elif (list_lst[i]['version'] == comp):
        lst.append(list_lst[i])