, если скорость имеет значение, вы можете использовать операторы try / исключением, чтобы просто попытаться сначала заполнить данные, а не проверять, существуют ли элементы, а затем добавлять их каждый раз в цикле
diz = {}
for obj in mc.ls(type='transform'):
try:
matteGroup = mc.getAttr('%s.matteGroup' %obj)
matteName = mc.getAttr('%s.matteName' %obj)
except Exception:
continue
try:
diz[matteGroup]
except KeyError:
diz[matteGroup] = {matteName : [obj]}
continue
try:
diz[matteGroup][matteName].append(obj)
except KeyError:
diz[matteGroup][matteName] = [obj]
длясначала попробуйте / исключите, было бы лучше поместить любое исключение, которое выдает maya, если attr не существует на узле (у меня сейчас нет открытого maya, так что я не могу это вставить ...).Это, по сути, проверяет attr и переходит к следующему объекту, если его нет.Вы можете поместить их туда вместо того, чтобы у каждого была своя собственная попытка / исключение, потому что должно произойти ошибка, если любой из них все равно не существует.
вторая попытка / исключение проверяет, находится ли группа matteGroup на верхнем уровневашего диктата.Если это не так, то вы знаете, что matteName и список объектов не входят в вашу структуру данных, поэтому он добавляет их и продолжает к следующему объекту
с третьей попытки / кроме попытки добавить объект.в список элементов DECT matteName.Если вы получили здесь keyError, это означает, что matteName отсутствует в вашем файле matteGroup, поэтому он добавляет его и создает список с текущим obj в качестве первого элемента в этом списке.
Итак, какЧто касается скорости, то всякий раз, когда элементы существуют в вашей структуре данных, следующий объект, который вы добавляете к этому элементу данных, будет просто добавляться без необходимости проверять, все ли остальные структуры данных на месте перед его добавлением, что делает ваш циклИдите быстрее, чем дальше в цикле, который вы идете (при условии, что есть много узлов, совместно использующих matteGroups и / или matteNames)