Я изменил порядок создания словаря слияния (all_classes
) ниже, но мне интересно, может ли он быть более эффективным.
У меня есть словарь словарей, например:
groups_and_classes = {'group_1': {'class_A': [1, 2, 3],
'class_B': [1, 3, 5, 7],
'class_c': [1, 2], # ...many more items like this
},
'group_2': {'class_A': [11, 12, 13],
'class_C': [5, 6, 7, 8, 9]
}, # ...and many more items like this
}
Функция создает новый объект из groups_and_classes
следующим образом (часто вызывается функция для его создания):
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]
}
Прямо сейчас есть цикл, который делает это:
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]
Пока что я изменил код для использования set
вместо list
, поскольку порядок списка не имеет значения и значения должны быть уникальными:
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)
Это немного лучше, и мне не нужно было преобразовывать наборы в списки из-за того, как all_classes
используется в коде.
Вопрос : Есть ли более эффективный способ создания all_classes
(кроме создания его в то же время, когда создается groups_and_classes
, и изменение везде, где эта функция вызывается)?