Python Forum
combining dicts into one dict when not all keys are in both dicts
Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
combining dicts into one dict when not all keys are in both dicts
#1
Hi,
Im trying to combine two different dicts into one dict, however the len of dict1 is greater then dict2 and I only need the keys that exist in both dicts.
those are my two dicts:
dict1: {'AFG': 'Afghanistan', 'ALB': 'Albania', 'ALG': 'Algeria'
dict 2: {'AFG': {'Gold': 0, 'Silver': 0, 'Bronze': 2, 'Total': 2}, 'ALG': {'Gold': 5, 'Silver': 4, 'Bronze': 8, 'Total': 17},
as you can see ALB not exist in dict2 and therefore shouldnt be in the new dict so the output I want to get is:
Output:
comb_dict = {'Afghanistan': {'Gold': 0, 'Silver': 0, 'Bronze': 2, 'Total': 2}, 'Algeria': {'Gold': 5, 'Silver': 4, 'Bronze': 8, 'Total': 17},
however, this is the output I get:
Output:
comb_dict = {'Afghanistan': {'Gold': 0, 'Silver': 0, 'Bronze': 2, 'Total': 2}, 'Albania': {'Gold': 0, 'Silver': 0, 'Bronze': 0, 'Total': 0}, 'Algeria': {'Gold': 5, 'Silver': 4, 'Bronze': 8, 'Total': 17},
thats my try to solve it:
def switch_to_full_name(dict1,dict2):
    if isinstance(dict1, dict) and isinstance(dict2, dict):
        for k in dict1:
            if k in dict2:
                comb_dict = dict(zip(dict1.values(), dict2.values()))
        return comb_dict
    else:
        return "Input must be a dictionary"
appreciate any help! thanks!
Reply
#2
Your dictionaries are defined incorrectly but other than that, the code seems to be functioning as expected.

dict1 = {'AFG': 'Afghanistan', 'ALB': 'Albania', 'ALG': 'Algeria'}
dict2 = {'AFG': {'Gold': 0, 'Silver': 0, 'Bronze': 2, 'Total': 2},
		'ALG': {'Gold': 5, 'Silver': 4, 'Bronze': 8, 'Total': 17}}

def switch_to_full_name(dict1,dict2):
    if isinstance(dict1, dict) and isinstance(dict2, dict):
        for k in dict1:
            if k in dict2:
                comb_dict = dict(zip(dict1.values(), dict2.values()))
        return comb_dict
    else:
        return "Input must be a dictionary"

print (switch_to_full_name (dict1, dict2))


Output:
{'Afghanistan': {'Gold': 0, 'Silver': 0, 'Bronze': 2, 'Total': 2}, 'Albania': {'Gold': 5, 'Silver': 4, 'Bronze': 8, 'Total': 17}}
Reply
#3
(May-12-2021, 02:44 PM)BashBedlam Wrote: Your dictionaries are defined incorrectly but other than that, the code seems to be functioning as expected.

dict1 = {'AFG': 'Afghanistan', 'ALB': 'Albania', 'ALG': 'Algeria'}
dict2 = {'AFG': {'Gold': 0, 'Silver': 0, 'Bronze': 2, 'Total': 2},
		'ALG': {'Gold': 5, 'Silver': 4, 'Bronze': 8, 'Total': 17}}

def switch_to_full_name(dict1,dict2):
    if isinstance(dict1, dict) and isinstance(dict2, dict):
        for k in dict1:
            if k in dict2:
                comb_dict = dict(zip(dict1.values(), dict2.values()))
        return comb_dict
    else:
        return "Input must be a dictionary"

print (switch_to_full_name (dict1, dict2))


Output:
{'Afghanistan': {'Gold': 0, 'Silver': 0, 'Bronze': 2, 'Total': 2}, 'Albania': {'Gold': 5, 'Silver': 4, 'Bronze': 8, 'Total': 17}}
Why are they defined incorrectly?
BTW the output you got is as well the wrong output.. instead of getting:
Output:
{'Afghanistan': {'Gold': 0, 'Silver': 0, 'Bronze': 2, 'Total': 2}, 'Algeria': {'Gold': 5, 'Silver': 4, 'Bronze': 8, 'Total': 17}}
Im still getting:
Output:
{'Afghanistan': {'Gold': 0, 'Silver': 0, 'Bronze': 2, 'Total': 2}, 'Albania': {'Gold': 5, 'Silver': 4, 'Bronze': 8, 'Total': 17}}
Albania shouldnt be there but Algeria
Reply
#4
dict1 = {'AFG': 'Afghanistan', 'ALB': 'Albania', 'ALG': 'Algeria'}
dict2 = {'AFG': {'Gold': 0, 'Silver': 0, 'Bronze': 2, 'Total': 2},
        'ALG': {'Gold': 5, 'Silver': 4, 'Bronze': 8, 'Total': 17}}

def switch_to_full_name(names, medals):
    new_dict = {}
    for country in names:
        if country in medals:
            new_dict[names[country]] = medals[country]
    return new_dict

print (switch_to_full_name (dict1, dict2))
ranbarr likes this post
Reply
#5
(May-12-2021, 03:33 PM)ranbarr Wrote: Why are they defined incorrectly?
Because...
(May-12-2021, 12:31 PM)ranbarr Wrote: dict1: {'AFG': 'Afghanistan', 'ALB': 'Albania', 'ALG': 'Algeria'
Should be:
dict1 = {'AFG': 'Afghanistan', 'ALB': 'Albania', 'ALG': 'Algeria'}
You are correct about the output; An oversight on my part. Here is the corrected code.

dict1 = {'AFG': 'Afghanistan', 'ALB': 'Albania', 'ALG': 'Algeria'}
dict2 = {'AFG': {'Gold': 0, 'Silver': 0, 'Bronze': 2, 'Total': 2},
        'ALG': {'Gold': 5, 'Silver': 4, 'Bronze': 8, 'Total': 17}}
 
def switch_to_full_name(dict1,dict2):
	if isinstance(dict1, dict) and isinstance(dict2, dict):
		comb_dict = {}
		for k in dict1 :
			if k in dict2:
				comb_dict [dict1 [k]] =  dict2 [k]
		return comb_dict
	else:
		return "Input must be a dictionary"
 
print (switch_to_full_name (dict1, dict2))
Output:
{'Afghanistan': {'Gold': 0, 'Silver': 0, 'Bronze': 2, 'Total': 2}, 'Algeria': {'Gold': 5, 'Silver': 4, 'Bronze': 8, 'Total': 17}}
ranbarr likes this post
Reply
#6
(May-12-2021, 05:03 PM)BashBedlam Wrote:
(May-12-2021, 03:33 PM)ranbarr Wrote: Why are they defined incorrectly?
Because...
(May-12-2021, 12:31 PM)ranbarr Wrote: dict1: {'AFG': 'Afghanistan', 'ALB': 'Albania', 'ALG': 'Algeria'
Should be:
dict1 = {'AFG': 'Afghanistan', 'ALB': 'Albania', 'ALG': 'Algeria'}
You are correct about the output; An oversight on my part. Here is the corrected code.

dict1 = {'AFG': 'Afghanistan', 'ALB': 'Albania', 'ALG': 'Algeria'}
dict2 = {'AFG': {'Gold': 0, 'Silver': 0, 'Bronze': 2, 'Total': 2},
        'ALG': {'Gold': 5, 'Silver': 4, 'Bronze': 8, 'Total': 17}}
 
def switch_to_full_name(dict1,dict2):
	if isinstance(dict1, dict) and isinstance(dict2, dict):
		comb_dict = {}
		for k in dict1 :
			if k in dict2:
				comb_dict [dict1 [k]] =  dict2 [k]
		return comb_dict
	else:
		return "Input must be a dictionary"
 
print (switch_to_full_name (dict1, dict2))
Output:
{'Afghanistan': {'Gold': 0, 'Silver': 0, 'Bronze': 2, 'Total': 2}, 'Algeria': {'Gold': 5, 'Silver': 4, 'Bronze': 8, 'Total': 17}}
Thanks! it worked! Smile
Reply


Forum Jump:

User Panel Messages

Announcements
Announcement #1 8/1/2020
Announcement #2 8/2/2020
Announcement #3 8/6/2020