I updated the way to create a federated dictionary ( all_classes) below, but I wonder if it can be more efficient.
I have a dictionary of dictionaries, for example:
groups_and_classes = {'group_1': {'class_A': [1, 2, 3],
'class_B': [1, 3, 5, 7],
'class_c': [1, 2],
},
'group_2': {'class_A': [11, 12, 13],
'class_C': [5, 6, 7, 8, 9]
},
}
The function creates a new object from groups_and_classes, like this (the function to create this is called often):
all_classes = {'class_A': [1, 2, 3, 11, 12, 13],
'class_B': [1, 3, 5, 7, 9],
'class_C': [1, 2, 5, 6, 7, 8, 9]
}
Right now there is a loop that does this:
all_classes = {}
for group in groups_and_classes.values():
for c, vals in group.iteritems():
for v in vals:
if all_classes.has_key(c):
if v not in all_classes[c]:
all_classes[c].append(v)
else:
all_classes[c] = [v]
So far I have changed the code to use setinstead list, since the order of the list does not matter, and the values must be unique:
all_classes = {}
for group in groups_and_classes.values():
for c, vals in group.iteritems():
try:
all_classes[c].update(set(vals))
except KeyError:
all_classes[c] = set(vals)
This is a little better, and I did not need to convert sets to lists because of the way it is all_classesused in the code.
: all_classes ( groups_and_classes , )?