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