【问题标题】:Convert a string with arithmetic operation to an interger in python [duplicate]在python中将具有算术运算的字符串转换为整数[重复]
【发布时间】:2018-08-01 02:10:00
【问题描述】:

我有一个问题,关于如何使用 + 或 * 等算术运算将字符串从字符串转换为整数。

这是我的输入和错误输出:

    a = int('4*5')
    Traceback (most recent call last):
    File "<stdin>", line 1, in <module>
    ValueError: invalid literal for int() with base 10: '4*5'

我预计此操作会将数字 20 作为整数保存在变量 a 中。

感谢您的帮助

【问题讨论】:

    标签: python


    【解决方案1】:

    它在不应用字符串中存在的数学运算的情况下将字符串作为一个整体评估为整数,因此显然这失败了,因为* 不是有效数字。

    有一些方法可以获取这样的代码并对其进行评估,这也可能是危险的,例如eval。但是,有一个名为 pandas 的库,它有一个更安全的 eval 函数:

    From the pandas documentation:

    支持以下算术运算:+、-、*、/、**、%、//(仅限 Python 引擎)以及以下布尔运算:| (or), & (and), and ~ (not)

    >>> import pandas as pd
    >>> pd.eval('4*5')
    20 
    

    与使用普通的 eval 相比,这是一种更安全的替代方案,后者可能会在您的计算机上运行潜在的恶意代码。

    【讨论】:

      【解决方案2】:

      你正在寻找eval:

      >>> a = eval('4 * 5')
      >>> a
      20
      >>> type(a)
      <type 'int'>
      

      警告:小心这个eval() 将评估像这样的数学表达式,但也会执行它给出的任何有效的 python 代码。例如,

      >>> eval( 'type(a)' )
      <type 'int'>
      

      【讨论】:

      • 它有效 :-) 感谢您的帮助和您的建议
      【解决方案3】:

      危险的方法是使用eval 函数。 eval 非常强大,并且经常会因输入中的小错误而导致意外或不需要的行为。

      要正确执行此操作,您需要处理字符串。提取每个数字字符串和操作。将字符串转换为ints,然后测试操作并应用所需的代码。例如:

      expr = '4*5'
      num1 = int(expr[0])
      num2 = int(expr[2])
      op = expr[1]
      
      if op == '*':
          result = num1 * num2
      

      一般而言,Python 语言语法(关键字、数学符号、标点符号等)在程序本身和您正在使用的数据之间不容易传输。

      【讨论】:

        【解决方案4】:

        如果您必须将表达式作为字符串,请使用 Python 的 eval 函数。

        a = eval('4*5')
        a
        > 20
        

        否则,只需删除引号使其成为表达式而不是字符串:

        a = 4*5
        a
        > 20
        

        【讨论】:

        • 那么int 是多余的......为什么这是upvoted ?
        • 问题字面意思是“用算术运算转换字符串”
        • @scharette 你是对的。我通常喜欢从原始问题中尽可能少地进行编辑,但在这种情况下它是没有帮助的。谢谢!
        • @user3483203 我知道是这样,但我也可以按照这个逻辑建议int(int(4*5))...
        • @scharette,如果你真的想确保它返回一个整数,你可以只做int(eval('4 * 5'))
        猜你喜欢
        • 1970-01-01
        • 2019-03-24
        • 1970-01-01
        • 2016-08-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-19
        相关资源
        最近更新 更多