如何在Python中创建基于变量值的字典

如何在Python中创建基于变量值的字典,python,variables,dictionary,activeworlds,Python,Variables,Dictionary,Activeworlds,我正在尝试创建一个字典,其中名称来自一个变量 情况如下,因为可能有更好的方法: 我正在使用API获取“对象”的属性。(名称、描述、X、Y、Z)等。我希望以一种按“对象”保存数据的方式存储此信息 为了获得这些信息,API迭代所有“对象” 因此,我的建议是,如果对象名称是我想要“捕获”的名称之一,我想创建一个具有该名称的字典,如下所示: ObjectName = {'Description': VarDescrption, 'X': VarX.. etc} (其中我说的是“Varetc…”,这将是

我正在尝试创建一个字典,其中名称来自一个变量

情况如下,因为可能有更好的方法: 我正在使用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”是什么的前两行代码

要解释API调用中的数字是什么:

231 AW_对象编号

232 AW_对象_X

233 AW_OBJECT_Y

234 AW_对象_Z

239 AW_对象描述


231-234是整数,239是字符串

我推断您使用的是。在以后的问题中首先提到这一点可以节省时间

我猜您的目标是创建一个顶级字典,其中每个键都是对象描述。每个值都是另一个字典,存储该对象的许多属性

我快速浏览了一下wiki上的AW SDK文档,我看不出有什么方法可以要求SDK提供属性名称、ID和类型的列表。因此,您必须以某种方式在程序中硬编码这些信息。除非您在其他地方需要它,否则最简单的方法是在创建字典的地方硬编码,这就是您已经在做的事情正在进行。要将其打印出来,只需打印属性字典的
repr
。我可能会将您的方法格式化为以下格式:

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

请显示您目前拥有的代码,您的问题有点模糊。
aw.aw_字符串(239)
返回什么?您似乎将其用作字典键,并在
循环中对其进行迭代以获取键。
aw.aw_字符串(239)[key]
aw.aw\u int(232)
(例如)?这是我在代码中遇到的错误:回溯(最近一次调用):文件“\u ctypes/callbacks.c”,第314行,在“调用回调函数”文件“c:\Users\Derek\Desktop\100\test4.py”中,第92行,在py\u cell\u对象打印“key=%s,value=%s%”(key,aw.aw\u string(239)[key])TypeError:字符串索引必须是整数,而不是标准。该错误意味着
key
是字符串,而
aw.aw_string(239)
是字符串。这就是您所期望的吗?这些是由属性ID号调用的属性。我程序的前两行是:from ctypes import*aw=CDLL(“aw”)so aw_string()用于提取字符串值,aw_int()同样用于整数。数字对应于我要从中提取值的属性。是的,这是字典的结构,但我需要一种方法来分隔每个对象。如果我要使用字典,字典={}在某种程度上必须是动态的。我想我不太理解你的问题。请编辑它以更详细地解释你的API给了你什么。要具体。不要试图用抽象的“对象”来描述它如果你的API使用了更具体的术语。我在格式化我的代码时遇到了麻烦。这是我的第一个问题。但是我在那里添加了它。@user2503734我已经根据你的问题和评论中的新信息更新了我的答案。我还没有列举属性。所有的.h文件都列出了这些属性,所以我应该能够找到一种解决方法这样做(我还不知道怎么做lol)。是的,我应该这样做,因为SDK的每个版本都可以更改它们的顺序。我没有指定它是什么程序,因为它并不完全是最流行的程序。但我确实理解为什么指向SDK文档的链接甚至对程序的陌生人都有帮助。我会很快尝试你给我的!我的问题是我想动态地说什么是CV法令
        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