【问题标题】:How can I turn 000000000001 into 1?如何将 000000000001 变成 1?
【发布时间】:2010-01-03 17:26:13
【问题描述】:

我需要把一个格式化的整数变成一个普通的整数:

  • 000000000001需要变成1
  • 000000000053需要变成53
  • 000000965948需要变成965948

等等。

似乎一个简单的int(000000000015) 会导致数字 13。我知道幕后有一些奇怪的东西。每次都能准确地做到这一点的最佳方法是什么?

【问题讨论】:

  • @orokusaki,您未能清楚说明的关键点:这些是数字还是字符串?如果它们应该是数字,那么您将不会以 00000015 开头,除非这是某种自动生成的源代码。另一种澄清方式:这些信息来自哪里?
  • int(0000015) 给你 13 因为它在使用 int() 函数之前被转换为 int(13) 。我相信您已经将数字作为字符串,在这种情况下它可以工作:int("000015") -> 15。
  • 查看stackoverflow.com/questions/1995561/…。这让我觉得是对代码的极大浪费。先把前导零放在上面,然后把它们去掉。跳过整个前导零概念有什么问题。避免所有这些会简单得多。
  • @S.Lott 完全正确。将数字存储为整数并仅在“查看层”进行格式化
  • 更新:我确实最终使用了 Integer,并像这样存储它。然后我创建了一个输出这个格式的格式化方法(这个格式只是为了和一些外部软件集成)。

标签: python parsing integer


【解决方案1】:

0 开头的数字被视为octal

>>> 07
7
>>> 08
   File "<stdin>", line 1
   08
    ^
SyntaxError: invalid token

您可以将零填充数字包装成一个字符串,然后它应该可以工作。

>>> int("08")
8

int() 接受一个可选参数,它是基数,所以上面的内容相当于:

>>> int("08", 10)
8

【讨论】:

  • 我不知道你为什么会被否决——这绝对是正确的。
  • @Kimvais(或其他人):无论如何,答案都已被编辑,并且是目前唯一真正有用的答案(因为缺少的基本参数是 not问题),因此您可以删除您的反对票。
  • 删除了反对票。在旁注中,这里的真正问题仍未解决 - OP 从哪里获取 formatted 整数文字 - 我认为格式化的数字应该是 strings 在任何情况下都不是整数文字
  • @Kimvais 从某种意义上说,它们是字符串还是文字都悬而未决。我现在明白除非我从文本文件中读取它们,否则文字是不可能的。它们来自数据库,所以我决定继续将它们存储为不带尾随零的整数,并在需要时使用我创建的方法在输出中格式化它们。
  • @orokusaki,根据定义,literals 只出现被视为 Python 源代码的文本,而不仅仅是任何“文本文件”。如果您以通常的方式读取文本文件(调用open() 等),您将得到字符串,而不是整数文字。这些答案中的大多数都告诉您如何将这些数据作为字符串处理,尽管大多数错误地建议您需要可选的 base 10 参数。
【解决方案2】:

前导零被视为八进制。我假设您正在转换字符串“000000013”,而不是文字 000000013,因此您应该能够通过 int("000000013",10) 将这些转换为以 10 为基数的整数

如果“伤害已经造成”,并且它们是文字,已经转换为八进制文字,则可以使用以下内容(注意,这是有害的和异端的:)

int(("%o" % 00000013),10)

【讨论】:

  • +1,不过我刚刚测试过,不需要指定10
  • @Lucas Jones,正确,但我认为在这种情况下,明确说明它的危害较小,因为 int() 函数仅用于去除前导零。
  • 如果您传递任意数量的“0”而没有任何其他数字,这将失败。
  • @Kimvais 谢谢。那么:将其存储为整数或字符串是否明智?
【解决方案3】:

试试这个:

>>> int('00000000053', 10)
53

【讨论】:

  • 反正默认基数是 10。
  • @gs - 如果有前导 0,则假定基数为 8。
  • 保罗:int("010") 给我 10,而不是 8; int("01A") 给出“ValueError:int() 以 10 为底的无效文字”。 gs:但是,help(int) 仍然说“在转换字符串时,使用可选的基数”,我们确实告诉人们阅读并遵循文档,对吗? :P
  • @Roger:我想我们可能在谈论两个不同版本的 Python。 2.6 之前的版本假定前导 0 是八进制常数。我相信 Py3 正在废除该约定,无论如何假设基数为 10。
  • 是的,我使用的是 2.6。不错的收获。
【解决方案4】:
if x = "0000000000000001":
    x = 1

【讨论】:

  • 我将创建 1 万亿个版本。
  • orokusaki:生成它们:for x in xrange(1000**4): print "if x == '%012d': x = %d" % (x, x)
  • 我试过了,但生成的文件是 7.1 艾字节。你建议把它放在 S3 上并通过套接字运行它,还是我应该买一些 ram 磁盘?
  • 更好地创建一个万亿元素的字典:{"000000000000001" : 1, "000000000000002":2, etc.} - much 更多 Pythonic
  • 我真的很想永远不要使用里面有你代码的东西:)
猜你喜欢
  • 2022-08-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-16
  • 1970-01-01
  • 2014-02-11
  • 2018-05-16
相关资源
最近更新 更多