Создавать вложенные словари во время цикла for - PullRequest
0 голосов
/ 13 июля 2020

Я создал список во время for l oop, который работает хорошо, но вместо этого я хочу создать словарь.

from System.Collections.Generic import List

#Collector
viewPorts = list(FilteredElementCollector(doc).OfClass(Viewport))

#create a dictionary
viewPortDict = {}

#add Sheet Number, View Name and boxoutline to dictionary
for vp in viewPorts:
    sheet = doc.GetElement(vp.SheetId)
    view = doc.GetElement(vp.ViewId)
    vbox = vp.GetBoxOutline()
    viewPortDict = {view.ViewName : {'sheetNum': sheet.SheetNumber, 'viewBox' : vbox}}

print(viewPortDict)

Результат будет следующим:

{'STEEL NOTES': {'viewBox': <Autodesk.Revit.DB.Outline object at 0x000000000000065A [Autodesk.Revit.DB.Outline]>, 'sheetNum': 'A0.07'}}

Какая структура идеальна , но я хочу, чтобы он захватил все , поскольку, пока он выполняет l oop, кажется, что он останавливается на первом l oop. Это почему? И как я могу заставить его поддерживать l oop?

Я пробовал разные вещи, например, создал другой список ключей под названием «Ключи» и список значений под названием «viewPortList», например:

dict.fromkeys(Keys,  viewPortList)

Но у меня всегда одна и та же проблема: я не могу перебрать все элементы. Для полного раскрытия информации я успешно создаю список. Вот как это выглядит.

from System.Collections.Generic import List

#Collector
viewPorts = list(FilteredElementCollector(doc).OfClass(Viewport))

#create a dictionary
viewPortList = []

#add Sheet Number, View Name and boxoutline to dictionary
for vp in viewPorts:
    sheet = doc.GetElement(vp.SheetId)
    view = doc.GetElement(vp.ViewId)
    vbox = vp.GetBoxOutline()
    viewPortList.append([sheet.SheetNumber, view.ViewName, vbox])

print(viewPortList)

Что отлично работает и печатает ниже (только часть длинного списка)

[['A0.01', 'APPLICABLE CODES', <Autodesk.Revit.DB.Outline object at 0x000000000000060D [Autodesk.Revit.DB.Outline]>], ['A0.02', etc.]

Но вместо этого мне нужен словарь. Любая помощь будет оценена. Спасибо!

1 Ответ

1 голос
/ 13 июля 2020

В примере со списком вы append входите в список. В примере со словарем вы каждый раз создаете новый словарь (таким образом удаляя данные из предыдущих итераций l oop). Вы также можете сделать эквивалент добавления к нему, просто назначив конкретному ключу в существующем словаре.

viewPortDict[view.ViewName] = {'sheetNum': sheet.SheetNumber, 'viewBox' : vbox}
...