【问题标题】:Weird behavoir with casting int [duplicate]铸造int的奇怪行为[重复]
【发布时间】:2019-07-07 21:02:42
【问题描述】:

我正在使用 Python 3.6.3,我遇到了来自 int()isdigit() 的奇怪行为,代码如下:

s = "..... not less than 66²/ 3 % of ......"
total = 0
for c in s:
    if c.isdigit():
        total += int(c)

ValueError: invalid literal for int() with base 10: '²'

我了解该错误,并且我知道我可以使用try catch 跳过该错误。我的问题是,如果 isdigit() 返回 true,那么 char\string 应该被正确转换,或者 isdigit() 应该返回 false。否则说int()isdigit()应该是连贯的。

【问题讨论】:

  • 实际上,isdigit 被证明可以在这种情况下工作
  • 这太令人难以置信了,感觉就像一个错误,但实际上是有道理的。 this 的重复(种类)
  • 您为什么会这样认为?如前所述,文档明确说明了其他情况。
  • 不知道它是否可行,但从技术上讲,我想您可以使用正则表达式将上标转换为**n,然后您的算法将更容易实现。甚至只是在上标的情况下使用 pythonic 指数符号。 **n
  • @juanpa.arrivillaga 我举起手来为表面上采用这种方法而感到内疚。至少对我来说,我很容易觉得我含蓄地知道它做了什么;极端情况是它不适用于all() 等的负数。考虑到快速的投票,我觉得那里有很多代码可能会因为这个而崩溃,无论是否明确记录:P跨度>

标签: python python-3.6


【解决方案1】:

这正是as documented

str.isdigit() 如果字符串中的所有字符都是数字,则返回 true 并且至少有一个字符,否则为假。数字包括 需要特殊处理的十进制字符和数字,例如 兼容性上标数字。这涵盖了不能 用于形成以 10 为底的数字,如 Kharosthi 数字。正式地, 数字是具有属性值 Numeric_Type=Digit 的字符 或 Numeric_Type=Decimal。

【讨论】:

  • 这很清楚......但这很烦人......即使我尝试使用 re.match([0-9]+, c) 并且我仍然得到相同的行为......有拒绝这些数字的方法,或者可以转换它们的方法吗?
  • re.match([0-9]+, c) 应该也可以工作 c in "1234567890" 以及 c.isdecimal()
  • 我喜欢@Gha93 的发展方向,询问是否可以替代使用int,这里必须有一种方法可以将isdigit 与相应的方法结合起来。
  • @Gha93 这取决于你想做什么,但all(c in '1234567890' for c in '66²') 可能就足够了
  • 对,我们应该明确try: int(s); catch ValueError: 是处理这个问题的正确方法。有些人不喜欢try/catch,但这是最 Pythonic 的方式。
猜你喜欢
  • 1970-01-01
  • 2017-08-23
  • 2020-09-17
  • 1970-01-01
  • 2011-08-25
  • 2023-03-21
  • 1970-01-01
  • 1970-01-01
  • 2012-10-03
相关资源
最近更新 更多