【问题标题】:Python string functionsPython 字符串函数
【发布时间】:2014-04-22 17:06:23
【问题描述】:

如何确定一个字符串是否可以是 Python 中的整数。例如:如果我编写名为 digit() 和 nondigit() 的函数。字符串必须是数字 (1-9) 或字母。

str1 = '4582'
str1.digit() == True
str2 = '458dfr'
str2.digit() == False
str3 = 'abcd'
str3.nondigit() == True
str4 = '258edcx'
str4.nondigit() == False

【问题讨论】:

标签: python string integer boolean digit


【解决方案1】:

str 对象有一个isdigit 方法,可以完成您的一项任务。从更广泛的角度来看,最好只是尝试一下看看:

def digit(s):
    try:
        int(s)
        return True
    except ValueError:
        return False

比如" 1234 ".isdigit()就是False(有空格),但是python可以把它转换成int,所以我的digit函数就是True。 p>

【讨论】:

  • +1,但请注意 " 1234 ".strip().isdigit() 将实现相同的目标,而不会引发(相对)昂贵的异常。
  • @That1Guy:OP 没有提到这一点,但如果他也希望 "-8" 评估为 True,我不会感到惊讶。另外,不要太担心性能。写清楚的内容,如果太慢,则进行概要分析和重构。
  • 使用is.digit(),它更快更“漂亮”,我在下面添加了基准作为答案
  • @SebastianRaschka:请注意,OP 询问“如何确定字符串在 Python 中是否可以是整数。”虽然 OP 将其解释为被 digitnotdigit 两个函数所覆盖,但关于字符串是否可以是整数的正确答案是尝试从中生成一个整数,更快更“漂亮”。
  • @StevenRumbalski -- 我假设你的意思是str.isdigit 而不是is.digit。我提到了str.isdigit,但它远不如尝试和捕获异常那么正确。由于它不检查填充空白和前导 '-' 符号等内容,因此它更快也就不足为奇了......
【解决方案2】:

有一个内置的。

'4582'.isdigit() == True
'458dfr'.isdigit() == False

“在引擎盖下”这可能看起来很像:

def isdigit(self):
    return all(ch in "0123456789" for ch in self)

也就是说,如果您想将其用作 int,只需将其用作 int。

data = "123456"
try:
    data = int(data)
except ValueError:
    # handle this if your data is not a number

永远不要测试某样东西是否可以转换然后尝试转换它。这适用于int 强制转换以及在打开文件之前检查文件是否存在。它创建了一个竞争条件,如果在您检查时 data 可以转换为一个数字,但随后另一个线程接管并在它转换为 int 之前对其进行更改,您会收到错误。与文件类似,如果您检查文件是否存在但在打开文件之前将其删除,那么您就是 SOL。

相反,做你想做的事情,如果它导致错误,请“请求宽恕”。我是Easier to Ask Forgiveness than Permission

【讨论】:

    【解决方案3】:

    使用.isdigit() 以内置方式执行此操作。

    >>> string = 'hello'
    >>> num = '98'
    >>> string.isdigit()
    False
    >>> num.isdigit()
    True
    >>> 
    

    您也可以创建自己的函数:

    >>> def digit(num):
    ...     try:
    ...             int(num)
    ...             return True
    ...     except ValueError:
    ...             return False
    ... 
    >>> digit('45')
    True
    >>> digit('hello')
    False
    >>> 
    

    【讨论】:

      【解决方案4】:

      我现在对不同的方法进行了基准测试。 is.digit() 更快,并且取决于你用它做什么(例如,大迭代),它可能值得在自己的函数上使用它。 (顺便说一句,它看起来更漂亮。)

      如果你想在你的机器上运行它,我把它放入IPython notebook

      如果出现以下情况,结果如下:

      import timeit
      
      def string_is_int(a_str):
          try:
              int(a_str)
              return True
          except ValueError:
              return False
      
      an_int = '123'
      no_int = '123abc'
      
      %timeit string_is_int(an_int)
      %timeit string_is_int(no_int)
      %timeit an_int.isdigit()
      %timeit no_int.isdigit()
      
      1000000 loops, best of 3: 401 ns per loop
      100000 loops, best of 3: 3.04 µs per loop
      10000000 loops, best of 3: 92.1 ns per loop
      10000000 loops, best of 3: 96.3 ns per loop
      

      另外,我测试了更一般的情况:

      import timeit
      
      def string_is_number(a_str):
          try:
              float(a_str)
              return True
          except ValueError:
              return False
      
      a_float = '1.234'
      no_float = '123abc'
      
      a_float.replace('.','',1).isdigit()
      no_float.replace('.','',1).isdigit()
      
      
      %timeit string_is_number(an_int)
      %timeit string_is_number(no_int)
      %timeit a_float.replace('.','',1).isdigit()
      %timeit no_float.replace('.','',1).isdigit()
      
      1000000 loops, best of 3: 400 ns per loop
      1000000 loops, best of 3: 1.15 µs per loop
      1000000 loops, best of 3: 452 ns per loop
      1000000 loops, best of 3: 394 ns per loop
      

      【讨论】:

        猜你喜欢
        • 2017-05-05
        • 2018-04-01
        • 1970-01-01
        • 2016-09-30
        • 2014-12-07
        • 2017-02-27
        • 2013-04-11
        • 2018-09-30
        • 1970-01-01
        相关资源
        最近更新 更多