# initializing the first layer, a list of dictionaries. experiments = [] for assignment in assignments: match_sums = {} experiments.append(match_sums) for i in xrange(len(classes)): for experiment in xrange(len(experiments)): # experiments[experiment][classes[i]] should hold a dictionary, # where the keys are the things that were matched against classes[i], # and the value is the number of times this occurred. experiments[experiment][classes[i]] = collections.defaultdict(dict) # matches[experiment][i] is an integer for what the i'th match was in an experiment. # classes[j] for some integer j is the string name of the i'th match. could be "dog" or "cat". experiments[experiment][classes[i]][classes[matches[experiment][i]]] += 1 total_class_sums[classes[i]] = total_class_sums.get(classes[i], 0) + 1 print experiments[0]["cat"]["cat"] exit() experiments[experiment][classes[i]][classes[matches[experiment][i]]] += 1 experiments = Counter() ... experiments[experiment, classes[i], classes[matches[experiment][i]]] += 1 for className, classIdx in enumerate(classes): experiment = collections.defaultdict(list) experiments[className] = experiment for assignment,assignmentIdx in enumerate(assignments): counterpart = classes[matches[assignmentIdx][classIdx]] experiment[counterpart].append((assignment,assignmentIdx)) print(len(experiments["cat"]["cat"]), len(experiments["cat"]))