【问题标题】:How do I change a str to and int and vise versa without using any built in python functions?如何在不使用任何内置 python 函数的情况下将字符串更改为 int,反之亦然?
【发布时间】:2012-04-29 08:36:50
【问题描述】:

该函数假设在这两种情况下输入都是可接受的(即)当对 int 执行 str 时假设 str 包含实际的 int,反之亦然无论如何都可以工作

该函数也不能使用易于使用的 Python 内置函数,例如 int() 或 str()。只能使用基本编码以及 def 标头,例如(for i in rang() 和条件等等。)请帮助。 :)

【问题讨论】:

  • 您将其标记为家庭作业很好,但您仍然需要展示您尝试过的内容或就您无法弄清楚的内容提出具体问题。
  • range()是内置函数,不能用吗?还是有一堆例外?
  • @gnibbler: range()(或至少xrange())在我看来是因为它确实属于基本编码。没有它,您可能无法执行其他语言已知的基本for 循环(例如for(var i=0; i<10; i++))。或者您需要列出i 的所有值,例如for i in [0,1,2,3,4] 而不是for i in xrange(5)
  • 我鄙视这类问题。如果您使用的是高级语言,请使用高级语言!
  • @Tadeck,实际上很容易用 while 循环替换它

标签: python string int


【解决方案1】:
def str2int(s):
    i = 0
    chr2digit = {`j`:j for j in (0,1,2,3,4,5,6,7,8,9)}
    for c in s:
        i = i*10 + chr2digit[c]
    return i


def int2str(i):  # rather easy in Python2
    return `i`

def int2str(i):  # works in Python2 and Python3
    return "%s"%i

【讨论】:

  • @ch3ka 这比十个ifs 差多少?
  • @ch3ka,在处理任意映射时,使用这样的字典(作为映射)是很正常的。不允许使用ord(),所以它很适合这里。通常我不会内联dict,但这只是播放代码,有什么问题?
  • @agf 不是,两者都应该在地狱中燃烧。
  • @ch3ka:考虑到这些荒谬的限制,我认为任何 好的解决方案都不存在。在 Python 中只有一种(显而易见的)方法可以做一件事,当你任意禁止这种明显的方法时,你就会有这样的选择。
  • 我对编辑后的表格投了赞成票。似乎是限制而不是愚蠢之间的一个很好的权衡。
【解决方案2】:

它可能很丑,但它有效。看到这个函数:

>>> def strint(val):
    digits = '0123456789'
    try:
        # Trying to treat it as a string-to-int conversion
        result = 0
        for l in val:
            result = result * 10 + digits.index(l)
    except (TypeError,):
        # There was a type error - we have int instead of string
        result = ''
        while val:
            digit = val % 10
            result = digits[digit] + result
            val = val // 10
        else:
            if not val and not result:
                result = '0'
    return result

>>> strint('123')
123
>>> strint(123)
'123'
>>> strint('0')
0
>>> strint(0)
'0'

【讨论】:

  • 我不认为你可以使用digits.index
  • @gnibbler:如果确实不允许使用digits.index,我可能会使用[i for i in xrange(len(digits)) if digits[i] == l][0] 之类的东西。而且我相信xrange / range 是允许的,因为没有它,您将不会拥有像其他语言已知的for 循环这样的基本解决方案。如果也不允许使用len,我将只使用10 而不是len(digits),因为小数位数相当恒定;)
【解决方案3】:

这仅适用于int 的替换,并不能处理所有事情,但这是家庭作业,所以剩下的交给你。如果你使用ord,它可以变得更简单。

def myint(s):
   x = 0
   for ch in s:
      if ch == '0': x = x * 10 + 0
      if ch == '1': x = x * 10 + 1
      if ch == '2': x = x * 10 + 2
      if ch == '3': x = x * 10 + 3
      if ch == '4': x = x * 10 + 4
      if ch == '5': x = x * 10 + 5
      if ch == '6': x = x * 10 + 6
      if ch == '7': x = x * 10 + 7
      if ch == '8': x = x * 10 + 8
      if ch == '9': x = x * 10 + 9
   return x

【讨论】:

  • 就连上面那个丑陋的函数也没有这个丑。
  • @ch3ka, above 当答案的顺序不断变化时,这不是一个非常有用的概念:)
  • if 链的一个缺点是您要对每个数字进行 10 次比较
  • @gnibbler 你当然是对的,这是我在这里的第一天。我的意思是 Tadecks 解决方案。
【解决方案4】:

这是您可以考虑的一种方法:

x = "1"
print type(x)
<type 'str'>
import string
if x in string.digits:
    # Now you know that x is a number
    print x

您也可以对string.ascii_letters 执行相同的操作。不是一个完整的答案,但应该为您指明正确的方向。

【讨论】:

  • 除非x10,而不是in string.digits
  • x[0] 和 x[1] 都可以。
猜你喜欢
  • 1970-01-01
  • 2020-01-18
  • 1970-01-01
  • 2014-07-22
  • 2022-01-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多