将字典列表作为字典关键字的值

时间:2019-11-09 02:52:07

标签: python

我有以下词典列表。

p = [ {"Id": "47","Name": "l","Cate": "GD31","Mark": 0,"Code": "l"},
     {"Id": "58","Name": "k","Cate": "GD33","Mark": 0,"Code": "k"},
    {"Id": "40","Name": "j","Cate": "GD35","Mark": 0,"Code": "j"},
    {"Id": "15","Name": "i","Cate": "GD37","Mark": 0,"Code": "i"},
    {"Id": "39","Name": "h","Cate": "GD39","Mark": 0,"Code": "h"},
    {"Id": "75","Name": "g","Cate": "LD31","Mark": 0,"Code": "g"},
    {"Id": "12","Name": "f","Cate": "LD33","Mark": 0,"Code": "d"},
    {"Id": "92","Name": "e","Cate": "LD35","Mark": 0,"Code": "e"},
    {"Id": "42","Name": "d","Cate": "LD37","Mark": 0,"Code": "d"},
    {"Id": "11","Name": "c","Cate": "LD39","Mark": 0,"Code": "c"},
    {"Id": "51","Name": "b","Cate": "SWW","Mark": 0,"Code": "b"},
    {"Id": "13","Name": "a","Cate": "SMM","Mark": 0,"Code": "a"} ]

在上面的词典中,我想基于“ Cate”值等于GD31或LD31将特定的词典存储到某个变量中。我尝试过的是:

if any(d['Cate'] == 'GD31' or d['Cate'] == 'LD31'  for d in p):
     print('D31 present')

在上面的代码中,我仅检查是否存在GD31或LD31。我需要在某些变量中存储特定的词典(“ Cate”值等于GD31或LD31),并更新所选的词典,如下所示:

new = [ { 'GD31':[{"Id":"47","Name_G":'l'}],
          'LD31':[{"Id":"75","Name_L":'g'}] }  ]

说明:如果同时存在GD31和LD31,则将GD31和LD31用作键,将“ Id,Name”作为值,然后将GD31的“名称”更新为“ Name_G”,对于LD31的“名称”更新为“ Name_L”

我希望结果为:

       new = [ { 'GD31':[{"Id":"47","Name_G":'l'}],
               'LD31':[{"Id":"75","Name_L":'g'}] }  ]

说明:

如果找到D31,则从词典列表中选择该特定词典。在该特定词典中,使用“ Id”和“ Name”。因此,GD31和LD31是键,而“ Id,名称”是值。 如果找到了D31,则将GD31的“名称”更新为“ Name_G”,将LD31的名称更新为“ Name_L”。 ***这适用于所有值D33,D35,D37和D39

希望大家都明白。有任何想法吗?

2 个答案:

答案 0 :(得分:2)

尝试一下:

p = [{"Id": "47","Name": "l","Cate": "GD31","Mark": 0,"Code": "l"},
    {"Id": "58","Name": "k","Cate": "GD33","Mark": 0,"Code": "k"},
    {"Id": "40","Name": "j","Cate": "GD35","Mark": 0,"Code": "j"},
    {"Id": "15","Name": "i","Cate": "GD37","Mark": 0,"Code": "i"},
    {"Id": "39","Name": "h","Cate": "GD39","Mark": 0,"Code": "h"},
    {"Id": "75","Name": "g","Cate": "LD31","Mark": 0,"Code": "g"},
    {"Id": "12","Name": "f","Cate": "LD33","Mark": 0,"Code": "d"},
    {"Id": "92","Name": "e","Cate": "LD35","Mark": 0,"Code": "e"},
    {"Id": "42","Name": "d","Cate": "LD37","Mark": 0,"Code": "d"},
    {"Id": "11","Name": "c","Cate": "LD39","Mark": 0,"Code": "c"},
    {"Id": "51","Name": "b","Cate": "SWW","Mark": 0,"Code": "b"},
    {"Id": "13","Name": "a","Cate": "SMM","Mark": 0,"Code": "a"} ]

new = [{d["Cate"]: [{"Id": d["Id"], "Name_" + d["Cate"][0]: d["Name"]}] for d in p if "D31" in d["Cate"]}]

print(new)

输出:

[{'GD31': [{'Id': '47', 'Name_G': 'l'}], 'LD31': [{'Id': '75', 'Name_L': 'g'}]}]

答案 1 :(得分:1)

您可以使用一个函数,以便通过调用该函数收集所需的任何门:

p = [{"Id": "47","Name": "l","Cate": "GD31","Mark": 0,"Code": "l"},
    {"Id": "58","Name": "k","Cate": "GD33","Mark": 0,"Code": "k"},
    {"Id": "40","Name": "j","Cate": "GD35","Mark": 0,"Code": "j"},
    {"Id": "15","Name": "i","Cate": "GD37","Mark": 0,"Code": "i"},
    {"Id": "39","Name": "h","Cate": "GD39","Mark": 0,"Code": "h"},
    {"Id": "75","Name": "g","Cate": "LD31","Mark": 0,"Code": "g"},
    {"Id": "12","Name": "f","Cate": "LD33","Mark": 0,"Code": "d"},
    {"Id": "92","Name": "e","Cate": "LD35","Mark": 0,"Code": "e"},
    {"Id": "42","Name": "d","Cate": "LD37","Mark": 0,"Code": "d"},
    {"Id": "11","Name": "c","Cate": "LD39","Mark": 0,"Code": "c"},
    {"Id": "51","Name": "b","Cate": "SWW","Mark": 0,"Code": "b"},
    {"Id": "13","Name": "a","Cate": "SMM","Mark": 0,"Code": "a"} ]

def getgates(hm): 
  s={} 
  for item in p:  
     if hm in item['Cate']:  
        s[item['Cate']] = [{"Id": item['Id'], "Name_" + item['Cate'][0]: item['Code']}]  
  return s 



print(getgates('D31'))
{'LD31': [{'Id': '75', 'Name_L': 'g'}], 'GD31': [{'Id': '47', 'Name_G': 'l'}]}

print(getgates('D35'))
{'LD35': [{'Id': '92', 'Name_L': 'e'}], 'GD35': [{'Id': '40', 'Name_G': 'j'}]}

print(getgates('D39'))
{'LD39': [{'Id': '11', 'Name_L': 'c'}], 'GD39': [{'Id': '39', 'Name_G': 'h'}]}