Как создать словарь на основе значения переменной в Python

Я пытаюсь создать словарь, в котором имя происходит от переменной.

Вот ситуация, потому что, возможно, есть лучший способ: я использую API для получения атрибутов «объектов». (Имя, описание, X, Y, Z) и т. Д. Я хочу сохранить эту информацию таким образом, чтобы данные сохранялись «объектом».

Чтобы получить эту информацию, API выполняет итерацию через все «объекты».

Итак, что было моим предложением в том, что если имя объекта является одним из тех, которые я хочу «захватить», я хочу создать словарь с таким именем:

ObjectName = {'Description': VarDescrption, 'X': VarX.. etc} 

(Где я говорю "Varetc..." , это будет значение этого атрибута, переданного API.

Теперь, поскольку я знаю список имен раньше времени, я МОГУ использовать очень длинное дерево If, но я ищу что-то более легкое для того чтобы закодировать для того чтобы достигнуть этого. (и расширяемый без добавления слишком большого количества кода)

Вот код, который у меня есть:

 def py_cell_object(): #object counter - unrelated to question addtototal() #is this an object I want? if aw.aw_string (239)[:5] == "TDT3_": #If yes, make a dictionary with the object description as the name of the dictionary. vars()[aw.aw_string (239)]={'X': aw.aw_int (232), 'Y': aw.aw_int (233), 'Z': aw.aw_int (234), 'No': aw.aw_int (231)} #print back result to test for key in aw.aw_string (239): print 'key=%s, value=%s' % (key, aw.aw_string (239)[key]) 

вот первые две строки кода, чтобы показать, что такое «aw»

 from ctypes import * aw = CDLL("aw") 

чтобы объяснить, какие цифры в вызовах API:

231 AW_OBJECT_NUMBER,

232 AW_OBJECT_X,

233 AW_OBJECT_Y,

234 AW_OBJECT_Z,

239 AW_OBJECT_DESCRIPTION,

231-234 являются целыми числами, а 239 – строкой

3 Solutions collect form web for “Как создать словарь на основе значения переменной в Python”

Я понимаю, что вы используете Active Worlds SDK . Это сэкономит время, чтобы упомянуть, что в первую очередь в будущих вопросах.

Я предполагаю, что ваша цель – создать словарь верхнего уровня, где каждый ключ является описанием объекта. Каждое значение – это другой словарь, сохраняющий многие атрибуты этого объекта.

Я быстро просмотрел документацию AW SDK по вики, и я не вижу способа спросить SDK о списке имен, идентификаторов и типов атрибутов. Поэтому вам придется как-то жестко запрограммировать эту информацию в вашей программе. Если вам это не нужно в другом месте, проще всего просто закодировать его там, где вы создаете словарь, и это то, что вы уже делаете. Чтобы распечатать его обратно, просто распечатайте объявление словаря атрибута. Я бы, скорее всего, форматировал свой метод следующим образом:

 def py_cell_object(): #object counter - unrelated to question addtototal() description = aw.aw_string(239) if description.startswith("TDT3_"): vars()[description] = { 'DESCRIPTION': description, 'X': aw.aw_int(232), 'Y': aw.aw_int(233), 'Z': aw.aw_int(234), 'NUMBER': aw.aw_int (231), ... etc for remaining attributes } print repr(vars()[description]) 

Некоторые утверждают, что вы должны указать именованные константы для чисел 232, 233, 234 и т. Д., Но я не вижу достаточных оснований для этого, если вы не нуждаетесь в них в нескольких местах, или если их легко сгенерировать автоматически из SDK (для например, путем разбора файла .h ).

Если переменные определены в локальной области, это так просто:

 obj_names = {} while True: varname = read_name() if not varname: break obj_names[varname] = locals()[varname] 

Это фактический код, который я использую в своей производственной среде

Надеюсь, поможет.

  cveDict = {} # StrVul is a python list holding list of vulnerabilities belonging to a report report = Report.objects.get(pk=report_id) vul = Vulnerability.objects.filter(report_id=report_id) strVul = map(str, vul) # fill up the python dict, += 1 if cvetype already exists for cve in strVul: i = Cve.objects.get(id=cve) if i.vul_cvetype in cveDict.keys(): cveDict[i.vul_cvetype] += 1 else: cveDict[i.vul_cvetype] = 1 
Python - лучший язык программирования в мире.