如何将没有双引号元素的字符串表示形式转换为实际列表?

5

我参考了很多资料,但大多数都使用 json.loads()ast.literal_eval(),但这对我的情况无效:

x = '[(0.0, 58.099669), 56565, Raining]'

预期输出:

x = [(0.0, 58.099669), 56565, 'Raining']

有没有任何解决办法?


1
None 应该变成字符串 'None' 还是实际的 None 对象?你如何判断? - Karl Knechtel
@KarlKnechtel 感谢您指出这一点。我已经编辑并删除了 None,因为我认为这不应该是这个问题的重点。这里的主要目标是将一个没有双引号元素的列表字符串转换为字符串。我相信我可以从那里处理 None。 - Weiting Chen
3
这段文字的创作原因是什么?我们可以提供实际解决方案,但可能并不适合实际问题。 - tmrlvi
3
然而,这其中有一个更广泛的观点。你只能找到处理包含引号的数据的工具,是因为“你需要引号来避免歧义”。 - Karl Knechtel
1
你总是可以编写一个解析器,但在了解输入数据的可变性之前,你无法编写它。 - Laggs
1
我明白了,感谢您的评论。现在我明白了双引号的用法。这段文本是从底层数据的数据库表示生成的。我怀疑我无法从内部更改数据结构。对于这个特定的实例,格式是固定的:[(A, B), C, D ,E]',其中A、B、C、D和E只能是字母数字。是的,我考虑过使用正则表达式解析器,但我想知道是否存在更优雅的解决方案。 - Weiting Chen
1个回答

5

这个怎么样:

class default_key(dict):
    def __missing__(self, key):
        return key

d = default_key()
x = '[(0.0, 58.099669), 56565, Raining]'

res = eval(x, d, {})
# res = [(0.0, 58.099669), 56565, 'Raining']

解释: eval 通常使用 globals()locals() 字典。但是,如果您不提供locals()并将globals()替换为返回查找时键名字的字典(并且该键未被找到),则给定列表中的每个“变量”名称在调用eval时都会转换为字符串。

然而,这仍然可能不安全。请参见这里


2
这对我非常有效!非常感谢您提供这个聪明的解决方案! - Weiting Chen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接