简体   繁体   中英

Convert a list-of-dictionaries to a dictionary

I have this list of dictionaries I want to convert to one dictionary

vpcs = [{'VPCRegion': 'us-east-1', 'VPCId': '12ededd4'},
       {'VPCRegion': 'us-east-1', 'VPCId': '9847'},
       {'VPCRegion': 'us-west-2', 'VPCId': '99485003'}]

I want to convert it to

       {'us-east-1': '12ededd4', 'us-east-1': '9847', 'us-west-2': '99485003'}

I used this function

def convert_dict(tags):
    return {tag['VPCRegion']:tag['VPCId'] for tag in tags}

but get this output it doesn't convert the first dictionary in the list

    {'us-east-1': '9847', 'us-west-2': '99485003'}

Perhaps a list of dictionary may fit your need - see code below: [{'us-east-1': '12ededd4'}, {'us-east-1': '9847'}, {'us-west-2': '99485003'}]

To elaborate on what other commented about dictionary key has to be unique, you can see that in the commented line which zip up the list_dict would result error if the 'vpcs' has 2 duplicate 'VPCRegion': 'us-east-1' and successfully create new dict if you take out one of the 'VPCRegion': 'us-east-1'.

vpcs = [{'VPCRegion': 'us-east-1', 'VPCId': '12ededd4'},
     {'VPCRegion': 'us-east-1', 'VPCId': '9847'},
     {'VPCRegion': 'us-west-2', 'VPCId': '99485003'}]

def changekey(listofdict):
 new_dict = {}
 new_list = []

 for member in listofdict:
     new_key = member['VPCRegion']
     new_val = member['VPCId']
     new_dict.update({new_key:new_val})
     new_list.append({new_key:new_val})
 return new_dict, new_list                                                                                              


dict1,list_dict=changekey(vpcs)
print(dict1)
print(list_dict)
#dict4=dict(zip(*[iter(list_dict)]*2))
#print(dict4)

Since your output must group several values under the same name, your output will be a dict of lists, not a dict of strings.

One way to quickly do it:

import collections

def group_by_region(vpcs):
  result = collections.defaultdict(list)
  for vpc in vpcs:
   result[vpc['VPCRegion']].append(vpc['VPCId'])
  return result

The result of group_by_region(vpcs) will be {'us-east-1': ['12ededd4', '9847'], 'us-west-2': ['99485003']}) .

As an entertainment, here's a cryptic but efficient way to get this in one expression:

import itertools

{key: [rec['VPCId'] for rec in group] 
 for (key, group) in itertools.groupby(vpcs, lambda vpc: vpc['VPCRegion'])}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM