for
loops are king in python. while
loops have their place, but most objects in python can be iterated over using for item in object:
syntax.
Here's one way to do it:
from collections import defaultdict
MaleDict = {'Jason':[(2014, 394),(2013, 350)], 'Stephanie':[(2014, 3), (2013, 21),]}
FemaleDict = {'Jason':[(2014, 56),(2013, 23)], 'Stephanie':[(2014, 335), (2013, 217),]}
name_keys = set(MaleDict.keys() + FemaleDict.keys())
combined_names = {}
for name_key in name_keys:
combined_values = defaultdict(list)
male_values_dict = dict(MaleDict[name_key])
female_values_dict = dict(FemaleDict[name_key])
year_keys = set(male_values_dict.keys() + female_values_dict.keys())
for year_key in year_keys:
combined_values[year_key].append(male_values_dict[year_key])
combined_values[year_key].append(female_values_dict[year_key])
combined_names[name_key] = dict(combined_values)
Output:
{'Jason': {2013: [350, 23], 2014: [394, 56]},
'Stephanie': {2013: [21, 217], 2014: [3, 335]}}
Or if you perfer to keep the tuple as a value:
from collections import defaultdict
MaleDict = {'Jason':[(2014, 394),(2013, 350)], 'Stephanie':[(2014, 3), (2013, 21),]}
FemaleDict = {'Jason':[(2014, 56),(2013, 23)], 'Stephanie':[(2014, 335), (2013, 217),]}
name_keys = set(MaleDict.keys() + FemaleDict.keys())
combined_names = {}
for name_key in name_keys:
combined_values = []
male_values_dict = dict(MaleDict[name_key])
female_values_dict = dict(FemaleDict[name_key])
year_keys = set(male_values_dict.keys() + female_values_dict.keys())
for year_key in year_keys:
tuple_result = (year_key, male_values_dict[year_key], female_values_dict[year_key])
combined_values.append(tuple_result)
combined_names[name_key] = combined_values
Output:
{'Jason': [(2013, 350, 23), (2014, 394, 56)],
'Stephanie': [(2013, 21, 217), (2014, 3, 335)]}
note: if in (2014, 394, 56),(2013, 350, 23)
2014 and 2013 are your keys a dictionary is better suited here.