如何对一个数字的各个数字排序?

10 投票
5 回答
26727 浏览
提问于 2025-04-15 13:42

我想用Python写一个简单的脚本,这个脚本可以接收一个数字,然后把这个数字的每个数字分开,分别按从小到大和从大到小的顺序排列,并把这两个结果保存在不同的变量里。这个过程是实现卡普雷卡常数

这可能是个很初级的问题。但我刚开始接触这个,找了很久也没在谷歌上找到能帮我的资料。我看到一个网站试着用列表来解释这个方法,但效果不是很好。

5 个回答

4

正如Mark Rushakoff在他的回答中提到的(但没有解决),str(n)这个方法在处理带有前导零的数字n时会出问题,而这在进行Kaprekar操作时是需要的。hughdbrown的回答同样也无法处理带前导零的情况。

确保你得到一个四个字符的字符串的一个方法是使用zfill这个字符串方法。例如:

>>> n = 2
>>> str(n)
'2'
>>> str(n).zfill(4)
'0002'

你还需要知道,在Python 3之前的版本中,数字前面的零表示八进制数:

>>> str(0043)
'35'
>>> str(0378)
  File "<stdin>", line 1
    str(0378)
           ^
SyntaxError: invalid token

在Python 3中,0043根本不是一个有效的数字。

4
>>> x = [4,5,81,5,28958,28] # first list
>>> print sorted(x)
[4, 5, 5, 28, 81, 28958]
>>> x
[4, 5, 81, 5, 28958, 28]
>>> x.sort() # sort the list in place
>>> x
[4, 5, 5, 28, 81, 28958]
>>> x.append(1) # add to the list
>>> x
[4, 5, 5, 28, 81, 28958, 1]
>>> sorted(x)
[1, 4, 5, 5, 28, 81, 28958]

很多人都提到过,你可以像这样把数字排序:

>>> int(''.join(sorted(str(2314))))
1234

这基本上是最标准的方法。

要反转一个数字?如果数字后面有零,就不太好用了。

>>> y = int(''.join(sorted(str(2314))))
>>> y
1234
>>> int(str(y)[::-1])
4321

[::-1]这个写法表示要反向遍历这个可遍历的对象。

19

将数字按从小到大和从大到小的顺序排列:

ascending = "".join(sorted(str(number)))

descending = "".join(sorted(str(number), reverse=True))

像这样:

>>> number = 5896
>>> ascending = "".join(sorted(str(number)))
>>>
>>> descending = "".join(sorted(str(number), reverse=True))
>>> ascending
'5689'
>>> descending
'9865'

如果你需要把它们变回数字(而不仅仅是字符串),可以用 int() 来转换:

>>> int(ascending)
5689
>>> int(descending)
9865

2020年1月30日

>>> def kaprekar(number):
...     diff = None
...     while diff != 0:
...         ascending = "".join(sorted(str(number)))
...         descending = "".join(sorted(str(number), reverse=True))
...         print(ascending, descending)
...         next_number = int(descending) - int(ascending)
...         diff = number - next_number
...         number = next_number
...
>>> kaprekar(2777)
2777 7772
4599 9954
3555 5553
1899 9981
0288 8820
2358 8532
1467 7641

撰写回答