【问题标题】:How can I evaluate a list of strings as a list of tuples in Python?如何在 Python 中将字符串列表评估为元组列表?
【发布时间】:2015-06-23 17:49:06
【问题描述】:

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

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]

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

【问题讨论】:

  • @BhargavRao Python 3 中的八进制数不支持 0xx 格式。
  • @BhargavRao 你好。具体错误为SyntaxError: invalid token。我刚刚将其添加到问题中。
  • @BhargavRao Python 2.x 中的前导 0 是八进制文字。在 Python 3.x 中不再允许这样做。例如055 是十进制值45 的八进制。
  • 我正在等待 OP 澄清他使用的是 2.x 还是 3.x(因为它在 2x 中变为八进制)。谢谢。
  • 顺便说一句,你可能需要找出产生这个的东西,弄清楚为什么它输出3739036,以及差异是否意味着什么。

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


【解决方案1】:

使用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)]

【讨论】:

  • 非常感谢您在这方面的帮助。您的解决方案非常接近,但它破坏了元组的零个元素,例如,(0, 0, 0, 255) 被评估为(, , , 255)。你会碰巧知道解决这个问题的方法吗?
  • 很好,试试[ast.literal_eval(re.sub(r'\b0+\B', '', pixel)) for pixel in pixels]
  • 另一种正则表达式方法:[tuple(int(d) for d in re.findall('\d+', pixel)) for pixel in pixels]。 (不如发布的答案。)
  • @AvinashRaj 嘿,非常感谢您对此的帮助和清晰的解释。 :)
【解决方案2】:

无需使用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]

【讨论】:

  • 非常感谢您的解决方案。这也是一个很好的方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-07-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-18
  • 2018-07-20
相关资源
最近更新 更多