如何将字符串列表评估为 Python 中的元组列表?
How can I evaluate a list of strings as a list of tuples in Python?
我有一个表单的数千个元素的列表,如下所示:
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]
处理此类事情并将此字符串列表评估为元组列表的好方法是什么?
使用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
匹配单词字符和非单词字符,反之亦然,因此这里必须在零之前和 space 或 (
符号之后存在单词边界。
更新:
>>> 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)]
无需使用 ast.literal_eval
或 re
。只需去掉括号并强制转换为整数:
def tupleize(s):
s = s.strip('()').split(',')
return tuple(int(entry) for entry in s)
pixels = [tupleize(pixel) for pixel in pixels]
我有一个表单的数千个元素的列表,如下所示:
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]
处理此类事情并将此字符串列表评估为元组列表的好方法是什么?
使用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
匹配单词字符和非单词字符,反之亦然,因此这里必须在零之前和 space 或 (
符号之后存在单词边界。
更新:
>>> 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)]
无需使用 ast.literal_eval
或 re
。只需去掉括号并强制转换为整数:
def tupleize(s):
s = s.strip('()').split(',')
return tuple(int(entry) for entry in s)
pixels = [tupleize(pixel) for pixel in pixels]