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

时间:2013-06-20 05:14:12

标签: python variables dictionary activeworlds

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

这是因为可能有更好的方法: 我使用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 个答案:

答案 0 :(得分:2)

我推断您使用的是Active Worlds SDK。在未来的问题中,首先要提到的是节省时间。

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

我快速浏览了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文件)。

答案 1 :(得分:0)

如果变量是在本地范围内定义的,那就简单如下:

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

答案 2 :(得分:0)

这是我在生产环境中使用的实际代码

希望它有所帮助。

        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