如何在Python中反转一个整数?

11

我正在创建一个Python脚本,它会倒序打印出整个“99瓶啤酒”歌曲。唯一无法倒置的是数字,因为它们是整数而不是字符串。

这是我的完整脚本:

def reverse(str):
   return str[::-1]

def plural(word, b):
    if b != 1:
        return word + 's'
    else:
        return word

def line(b, ending):
    print b or reverse('No more'), plural(reverse('bottle'), b), reverse(ending)

for i in range(99, 0, -1):
    line(i, "of beer on the wall")
    line(i, "of beer"
    print reverse("Take one down, pass it around")
    line(i-1, "of beer on the wall \n")
我知道我的反转函数需要一个字符串作为参数,但我不知道如何输入一个整数,或者在脚本中如何反转这个整数。

你期望10、20或30...的输出是什么? - Artjom B.
10 变成 01,56 变成 65 等等。 - Matthew C
16个回答

18

不将数字转换为字符串:

def reverse_number(n):
    r = 0
    while n > 0:
        r *= 10
        r += n % 10
        n /= 10
    return r

print(reverse_number(123))

2
+1 reverse_number(10) == 1 是一个没有前导零的正确数字。 - Artjom B.
2
虽然在这种情况下,我认为那是件坏事! - jonrsharpe
1
所以,这不是答案,因为这个 - Artjom B.
9
请使用 n //= 10 代替 n /= 10。这将导致较小的数字,并且不会返回一个无限的数值“inf”,以达到理想的反转数字效果。 - Beatriz Fonseca
2
正如@BeatrizFonseca所说,特别是在使用Python 3时,您必须使用// - beeftosino

9
你的方法有些奇怪。你已经有一个翻转函数了,为什么不让line按正常顺序构建行呢?
def line(bottles, ending):
    return "{0} {1} {2}".format(bottles, 
                                plural("bottle", bottles), 
                                ending)

以下是这段代码的运行过程:

>>> line(49, "of beer on the wall")
'49 bottles of beer on the wall'

然后将结果传递给reverse函数:
>>> reverse(line(49, "of beer on the wall"))
'llaw eht no reeb fo selttob 94'

这使得分别测试代码的各个部分并在将其全部汇总时了解正在发生的情况变得更加容易。

8
像这样的内容吗?
>>> x = 123
>>> str(x)
'123'
>>> str(x)[::-1]
'321'

1
负数应该被考虑。 - ZDL-so

4
最好的方法是:
x=12345
a=str(x)[::-1]\\ In this process i have create string of inverse of integer (a="54321")
a=int(a) \\ Here i have converted string a in integer 

或者说一行代码是

a=int(str(x)[::-1]))

1
def reverse(x):
        re = 0
        negative = x < 0
        MAX_BIG = 2 ** 31 -1
        MIN_BIG = -2 ** 31 
        x = abs(x)

        while x != 0:
            a = int(x % 10)
            re = re * 10 + a
            x = int(x // 10)

        reverse = -1 * re if negative else re
        return 0 if reverse < MIN_BIG or reverse > MAX_BIG else reverse

这是针对32位整数的(-2^31;2^31-1)


Python没有整数大小限制,所以这段代码的一半是无用的 :/ - Tushar Sadhwani

1
def reverse_number(n):
    r = 0
    while n > 0:
        r = (r*10) + (n % 10)
        print(r)
        r *=10
        n //= 10
    return r


print(reverse_number(123))

尝试反转数字,这可能会更好地帮助您。 - Vinay

0

更健壮的解决方案来处理负数:

def reverse_integer(num):
    sign = [1,-1][num < 0]
    output = sign * int(str(abs(num))[::-1])

0
def reverse_number(n):
r = 0
while n > 0:
    r *= 10
    r += n % 10
    n /= 10
return r

打印(reverse_number(123))

如果数字以零结尾,例如100和1000,则此代码将无法正常工作,返回1


0

原始数字被接收在一个

a = 123

我们将整数转换为字符串,然后反转它,再将其转换为整数并将反转后的数字存储在b中

b = int("".join(reversed(str(a))))

打印a和b的值 print(a,b)


如果存在0,则忽略0。 - demouser123
如果您最终要将int转换为字符串,那么为什么不使用切片呢?它比join快得多。 - d02d33pak

0
你可以使用str(i)将整数转换为字符串,然后使用反转函数。
以下代码行应该符合你的要求:
    def line(b, ending):
        print reverse(str(b)) or reverse('No more'), plural(reverse('bottle'),reverse(str(b))), reverse(ending)

这将给出例如'74 elttobs llaw eht no reeb fo',而不是'llaw eht no reeb fo elttobs 74' - jonrsharpe
你说得对@jonrsharpe,我一开始没有看结果,只回答了他/她明确的问题。我只是把他的代码中的数字反转了一下。 你之前的回答是我会选择的方式(整个字符串反转),我只是想回答隐含的问题 :-) - Amduscias
仅仅为了在技术上是正确的(“最好的正确方式”<g>):在Python中,没有“cast”的概念(在C / C++ / Java等语言中译为“转换”)。str(i)使用i的字符串表示形式作为值实例化一个新的str对象。 - bruno desthuilliers

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接