将命名元组的字符串转换为列表。
将命名元组的字符串转换为列表。
如何将命名元组的字符串转换为列表?\n问题是我必须将命名元组的列表存储在SQLite的列中,但SQLite(显然)不支持该格式。我考虑将其转换为字符串。然而,由于我的元组是一个命名元组,我不知道如何再次从字符串转换为列表。\n我的命名元组列表类似于上面的示例,但它有6个参数,而不是上面显示的2个参数。编辑-参数是布尔值、整数和字符串。\n我尝试使用mapping,但遇到了以下错误:\n>>>> string = str(points)\n>>> l = string.strip(\"[]\")\n>>> p = map(Point._make, l.split(\", \"))\nTraceback (most recent call last):\nFile \"
问题的出现原因:用户想要将命名元组(namedtuple)转换为列表(list)。
解决方法:使用pickle等模块将Python对象存储到文件中,或者使用eval函数与repr函数结合来实现转换。
用户提到使用pickle模块来存储Python对象到文件中,但不确定命名元组是否能与pickle一起使用。如果命名元组的数据源是已知的,则可以使用eval函数与repr函数结合来实现转换。eval函数将字符串解析为Python对象,而repr函数返回对象的字符串表示形式。通过将命名元组转换为字符串,并使用eval函数将其转换回对象,可以实现转换。
代码示例:
>>> repr(points) '[Point(x=4, y=7), Point(x=8, y=9), Point(x=3, y=5)]' >>> eval(repr(points)) [Point(x=4, y=7), Point(x=8, y=9), Point(x=3, y=5)]
这个方法很有效。在有时间的时候,用户会研究pickle模块。之前听说过这个模块,但没有关注过。总之,非常感谢。
应该尽量避免使用eval函数,因为它可以执行任意代码,无论它对计算机做什么。pickle.dumps(points)和pickle.loads(pickle_str)是更安全和更优越的解决方案。pickle模块可以将对象序列化为字节流,然后可以将其存储到文件中或从文件中加载。
问题的原因:
上述代码中,points是一个由namedtuple组成的列表。问题是如何将这个列表转换为一个普通的列表,其中每个元素是一个字典,字典的键是namedtuple的属性名,值是属性值。
解决方法:
1. 使用json模块将namedtuple列表转换为json格式的字符串,然后再将json字符串转换为普通的列表。
代码如下:
import json points_str = json.dumps([x._asdict() for x in points]) points2 = [Point(**x) for x in json.loads(points_str)]
2. 使用exec函数将points列表的repr字符串作为代码执行,将结果赋值给points2。
代码如下:
points_str = repr(points) exec "points2 = %s" % points
这样,问题就得到了解决。通过这两种方法,可以将原始的namedtuple列表转换为普通的列表,方便后续的处理和操作。
问题的原因是:用户想要将namedtuple对象转换为列表。
解决方法是使用不同的方法来实现这个目标。一种方法是使用JSON模块。可以使用json.dumps()函数将namedtuple对象转换为字典,并使用json.dumps()函数将字典转换为JSON字符串。另一种方法是使用pickle模块。可以使用pickle.dumps()函数将namedtuple对象序列化为字节字符串,并使用pickle.loads()函数将字节字符串反序列化为namedtuple对象。另外,还可以使用eval函数将namedtuple对象转换为列表,但不建议使用eval函数,因为它具有安全风险。
以下是使用JSON模块的示例代码:
import json from collections import namedtuple Point = namedtuple("Point", "x y") p = Point(3, 4) json_str = json.dumps(p._asdict()) print(json_str) json_dict = json.loads(json_str) p_new = Point(**json_dict) print(p_new)
以下是使用pickle模块的示例代码:
import pickle from collections import namedtuple Point = namedtuple("Point", "x y") p = Point(3, 4) pickle_str = pickle.dumps(p) print(pickle_str) p_new = pickle.loads(pickle_str) print(p_new)
总之,根据个人喜好和具体需求,可以选择使用JSON模块、pickle模块或eval函数来将namedtuple对象转换为列表。