【问题标题】:how does .isdigit() work in this case?.isdigit() 在这种情况下如何工作?
【发布时间】:2016-10-11 20:30:34
【问题描述】:

当我正在寻找“计算给定字符串中同时包含字母和数字的数字”问题的解决方案时,有一个带有内置函数 .isdigit() 的解决方案。这里是:

def count_numbers1(a):
    return sum(int(x) for x in a if x.isdigit())

它工作得很好,但我不知道它是如何工作的。我读过.isdigit() 如果字符串中至少有一个数字则返回true,否则返回false。

还有一个问题:函数如何从字符串中“取出”数字并将其转换为整数以及如何跳过字母?为什么int(x)x是一个字母时不会产生错误?如:

>>> int('a')
Traceback (most recent call last):
  File "<pyshell#77>", line 1, in <module>
     int('a')
ValueError: invalid literal for int() with base 10: 'a'

【问题讨论】:

  • 我读到如果字符串中至少有一个数字,.isdigit() 将返回 true 这是错误的。你在哪里读到的?
  • [链接]tutorialspoint.com/python/string_isdigit.htm。可能是我理解错了
  • 该页面上的第一句:“isdigit() 方法检查字符串是否仅由数字组成”。

标签: python string sum digits


【解决方案1】:

首先,该函数不会计算字符串中的数字。它汇总字符串中的数字。其次,str.isdigit() 仅在字符串中的所有 个字符都是数字而不只是其中一个字符时才返回 true。来自str.isdigit() documentation

如果字符串中的所有字符都是数字并且至少有一个字符,则返回true,否则返回false。

这意味着'1a'.isdigit() 为假,因为该字符串中有一个非数字字符。对字符串的迭代会产生 1 个字符的字符串,因此函数循环中始终只有一个字符。

所以,int() 永远不会在任何非数字上调用,因为 generator expression 会过滤掉任何不是数字的字符。

如果您改用简单的for 循环,您可以看到会发生什么:

>>> string = 'foo 42 bar 8 1'
>>> for character in string:
...     if character.isdigit():
...         print(character)
...
4
2
8
1

因为str.isdigit() 只对包含 个数字的字符串(这里每个只包含一个字符)返回true。

您可以使用list comprehension 来代替for 循环来生成一个列表:

>>> [c for c in string if c.isdigit()]
['4', '2', '8', '1']

现在很容易添加 int() 调用并查看区别:

>>> [int(c) for c in string if c.isdigit()]
[4, 2, 8, 1]

因为只传递数字,所以int() 始终有效,它永远不会在字母上调用。

然后,您的函数在这些值上使用 sum(),因此对于我的示例字符串,加起来 4 + 2 + 8 + 1 是 15:

>>> sum(int(c) for c in string if c.isdigit())
15

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-05-25
    • 2018-06-16
    • 2017-06-21
    • 2018-01-19
    • 1970-01-01
    • 2021-12-06
    • 2020-12-27
    • 2021-08-31
    相关资源
    最近更新 更多