如何在Python中将字符串列表评估为元组列表?

时间:2015-06-23 17:49:06

标签: python string tuples abstract-syntax-tree literals

我有一个包含如下表单的数千个元素的列表:

pixels = ['(112, 37, 137, 255)', '(129, 39, 145, 255)', '(125, 036, 138, 255)' ...]

我正在尝试使用ast.literal_eval将这些字符串元素转换为元组,但是在遇到错误SyntaxError: invalid token的前导零(例如,在显示的第三个元组字符串中)时会遇到问题。

pixels = [ast.literal_eval(pixel) for pixel in pixels]

处理这类事情的好方法是什么,并将这个字符串列表评估为元组列表?

2 个答案:

答案 0 :(得分:4)

使用re模块。

>>> import re
>>> import ast
>>> pixels = ['(112, 37, 137, 255)', '(129, 39, 145, 255)', '(125, 036, 138, 255)']
>>> [ast.literal_eval(re.sub(r'\b0+', '', pixel)) for pixel in pixels]
[(112, 37, 137, 255), (129, 39, 145, 255), (125, 36, 138, 255)]

re.sub(r'\b0+', '', pixel)有助于删除前导零。 \b在单词字符和非单词字符之间匹配,反之亦然,所以在零之前和空格或(符号之后必须存在单词边界。

<强>更新

>>> pixels = ['(0, 0, 0, 255)', '(129, 39, 145, 255)', '(125, 036, 138, 255)']
>>> [ast.literal_eval(re.sub(r'\b0+\B', '', pixel)) for pixel in pixels]
[(0, 0, 0, 255), (129, 39, 145, 255), (125, 36, 138, 255)]

答案 1 :(得分:4)

无需使用ast.literal_evalre。只需剥离括号并强制转换为整数:

def tupleize(s):
    s = s.strip('()').split(',')
    return tuple(int(entry) for entry in s)

pixels = [tupleize(pixel) for pixel in pixels]