2015-11-25 61 views
0

我不太懂得怎么说我的问题,因为这不是人们经常会做的事情。 这是我的情况:如何从执行的字符串中检索值?

我有一个值列表。

Values= ["1","2","3","4"] 

然后我希望能够分别访问每个值并将它们组合成一个字符串,并在它们之间用逗号分隔。我写了一些代码,我想以这种方式格式化一个字符串('{}'。format()),使得结果如下所示:'1,2,3,4'。我的代码是我迄今(它也是我宁愿尽可能使用代码结构)如下:

string = "{}".format(exec(
    "Out= ''\n" 
    "for value in Values:\n" 
    " Out+= value + ','\n" 
    "Out")) 
print(string) 

如果被给出作为参数传递给“EXEC字符串中'功能,我写的‘打印(出)’ IE:

string = "{}".format(exec(
    "Out= ''\n" 
    "for value in Values:\n" 
    " Out+= value + ','\n" 
    "print(Out)")) 

然后该程序正常运行,并打印出‘1,2,3,4’,但不能将其存放在‘字符串’ (这是可以预料的)

因此我想添加一个函数以确保它可以返回某事。我写了以下内容,但正如预期的那样,它也没有奏效。字符串仍然无:

string = "{}".format(exec(
    "def do_stuff():\n" 
    " Out = ''\n" 
    " for value in Values :\n" 
    "  Out += value + ','\n" 
    " return Out \n" 
    "do_stuff()")) 

现在,我也知道合并字符串这个方法是隔靴搔痒为字符串组合的首选方式,但让我给你一些背景。

我在python中制作游戏。有一个Character类,它包含各种数据类型的各种属性(如dict,list,int,str,float ....以及一些自定义的属性:AI,Item,ActiveSkill,PassiveSkill,Effect,Weapon,Armor等等......) 现在,我的计划是能够将游戏进程存储在json树中。为此,我开始为每个实体提供一种方法,将其所有属性转换为以字符串形式存储的json树。这样,当我想保存游戏并且涉及到角色时,它会对其所有属性进行排序,但它也必须调用它所引用的对象(例如ActiveSkills)。对于列表中的每个ActiveSkills,它都必须调用自己的json语法字符串,并使用逗号进行组合。

下面是我的一些代码,以帮助你明白我想做的事:

json += \ 
    '"ActiveSkills":[{oActiveSkills}],' \ 
    '"PassiveSkills":[{oPassiveSkills}].' \ 
    '"Effects":[{oEffects}],'.format(
     oActiveSkills=exec(
      "Skills = ''\n" 
      "for skill in self.ActiveSkills:\n" # ActiveSkills is a list of ActiveSkill objects 
      " Skills+=skill.encode_to_json() + ','\n" 
      "return Skills"), 
     oPassiveSkills=exec(
      "Skills = ''\n" 
      "for skill in self.PassiveSkills:\n" # PassiveSkills is a list of PassiveSkill objects 
      " Skills+=skill.encode_to_json() + ','\n" 
      "return Skills"), 
     oEffects=exec(
      "Effects = ''\n" 
      "for effect in self.Effects:\n" # Effects is a list of Effect objects 
      " Effects+=effect.encode_to_json() + ','\n" 
      "return Effects")) 

我知道这个代码目前不跑,因为你只能从一个函数中返回,但我真的不知道如何快速简单地做到这一点。

作为最后的手段,我挽救了一个解决方案,就是一切手工完成。 IE:有一些for循环从返回的值中创建一个字符串。将此字符串添加到json字符串中,之后您将手动打开并关闭“},{”,并确保末尾没有“,”。然后对PassiveSkills和Effects也重复此操作。最后,用“}”关闭json字符串,并将其添加到'json'(字符串类型)变量中...我想要最小化由此占用的空间,并且我希望此系统可以灵活,所以无论你拥有多少技能,你都可以在不改变代码的情况下继续添加越来越多的这些json字符串。

+0

请看['str.join()'](https://docs.python.org/3/library/stdtypes.html#str.join)。 –

+0

当一个列表传入JSON。人们需要担心逗号。同样,当你提取列表时,你也不需要担心逗号。 JSON为你担心。除非我在这里得到错误的想法.... –

+0

@ El'endiaStarman 是的,但后来我提出了一种情况,我有一个对象列表,我从中调用一个返回值的方法。我应该创建一个新的列表吗? IE:'技能= [i.encode_to_json:对于我在ActiveSkills中]',然后按照你的建议'json + =“,”。join(Skills)'? – Alexz

回答

3

加入使用','列表:

Values = ["1","2","3","4"] 
result = ",".join(Values) 
print(result) 

在在线文档中更多信息有关str.join(iterable)可以发现here

为了更好地解决存储字典和列表(以及使用pickle对象)的问题,您应该查看Python标准库中的json和pickle包。

例如,使用JSON:

import json 

mydata = {} 
mydata['hello'] = { 'value1':1, 'valuuelist':[1,2,3,4] } 

print(json.dumps(mydata)) 

输出:

{"hello": {"valuuelist": [1, 2, 3, 4], "value1": 1}} 

所以,不推出自己的编码器,除非你真的来。

+0

问题是,我想要保存在json文件中的数据分散在各种对象中(EG:字符有其自己的属性,但字符的技能也如此)。要将所有数据作为单个树存储,我需要每个对象以json语法创建一个字符串,然后将与该对象引用的任何对象组合(每个对象仅由另一个对象引用)。​​这样我就有一个层次结构,我试图向后设计json树)。 – Alexz

+0

我可以想象(尽管我不能指出一个实现)主对象可以注册所有的子对象,并且可以通过调用注册的子对象的pickle来提供加载/恢复所有数据的方法”。这可能是您设计的重要组成部分,以后很难进行改造。见例如http://stackoverflow.com/questions/4529815/saving-an-object-data-persistence-in-python – barny

+0

我以前使用过咸菜,而我最大的问题是我不理解它如何编码数据。因此,如果系统已更新,那么我将很难再加载数据,因为我不知道如何从腌制对象中挑出所需数据,而不会加载以前版本的对象在一举。 我决定用json作为我的数据存储,因为加载数据非常简单,即使使用数据的进程(方法)发生了变化。我已经设计了它,以便尽可能轻松地进行改造......但我可能错过了一些东西。 – Alexz

0

要将序列中的每个元素连接到一个字符串中,可以使用连接方法。

L=['1','2','3'] 
    string=",".join(L) 
    print(L)