python: ast.literal_eval() 给出 ValueError: malformed string

标签 python

我已经在这个论坛上阅读了很多关于这个特定错误的其他帖子,但没有什么能真正帮助我解决我的问题。

基本上我有这样的东西:

{' Marie ': ' (ENG,80) (PHY,65) (CHEM,80) '} 

我正在尝试将以上内容转换为:

[(ENG,80),(PHY,65),(CHEM,80)] 

这样我就可以访问元组的每个等级并将它们相加并返回结果。

到目前为止,我的尝试是:

>>> N={' Marie ': ' (ENG,80) (PHY,65) (CHEM,80) '}
>>> q= N.items()
>>> q
[(' Marie ', ' (ENG,80) (PHY,65) (CHEM,80) ')]
>>> r=N.values()[0]
>>> r
' (ENG,80) (PHY,65) (CHEM,80) '
>>> y=r.strip().split()
>>> y
['(ENG,80)', '(PHY,65)', '(CHEM,80)']
>>> remove=",".join(y)
>>> remove
'(ENG,80),(PHY,65),(CHEM,80)'
>>> list(ast.literal_eval(remove))
ValueError: malformed string

我怎样才能达到预期的结果? 是否可以直接从字典中这样做?

最佳答案

字符串 '(ENG,80),(PHY,65),(CHEM,80)' 不是有效的 Python 文字。假设您希望将 ENGPHYCHEM 视为字符串,但未将它们引用为有效的 Python 字符串文字。

只需手动解析这部分:

N = {' Marie ': ' (ENG,80) (PHY,65) (CHEM,80) '} 
value = N.values()[0]
output = [(token, int(num)) for tup in value.split() for token, num in (tup.strip('()').split(','),)]

演示:

>>> N = {' Marie ': ' (ENG,80) (PHY,65) (CHEM,80) '}
>>> value = N.values()[0]
>>> [(token, int(num)) for tup in value.split() for token, num in (tup.strip('()').split(','),)]
[('ENG', 80), ('PHY', 65), ('CHEM', 80)]

关于python: ast.literal_eval() 给出 ValueError: malformed string,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33388841/

相关文章:

python - 如何在google colab中提取rar文件

python - 从对象值创建 python 字符串

python - 如果在为 ‘eggs’ 提供要在函数中使用的本地值之前运行 print(eggs),为什么会出现错误?

python - 如何在for循环期间修改列表条目?

python - 比较两列,如果满足条件,则将 '1' 添加到新列

python - Django通过最后创建的对象进行反向查询

python - 如何在 Pandas 查询中引用分层列?

以 Python 方式将 header 添加到 csv 文件

python - 在Python中浏览并显示图像文件

python - Django:Startapp 生成的文件放入现有项目文件夹中