给定数字的最小排列

3

我有一个字符串表示的数字,我想找到由原始数字组成的最小数字,即:

56340902138765401345 -> 10001233344455566789

我将字符串转换为列表并进行排序。
num = '56340902138765401345'
a = list(num)
a.sort()

由于数字不能以零开头(但我需要使用原始数字中的零),因此我正在寻找第一个非零元素并将其放在前面:

inext = next(i for i, x in enumerate(a) if x != '0')
a.insert(0, a.pop(inext))

然后我将列表转换回字符串并显示出来。
num2 = ''.join(map(str, a))
print(num2)

它能够工作,但对我来说似乎不太符合Pythonic或优雅的风格。是否有更好的方法?


1
为什么00011233344455566789不是您数字的最小排列?因为您不能有前导零。 - Cory Kramer
是的,我不能有前导零。 - frost
2
这对我来说似乎是一个相当合理的方式。它也适用于其他进制和非数字字符,例如十六进制字符串中的数字。 - mhawke
1
你可以使用 a = sorted(num) 来节省一行代码。而且,由于你的元素已经是字符串,所以你不必将它们映射到 str,因此 num2 = ''.join(a) 就足够了。 - Vincent
4个回答

5
我们可以数出这个数字中的零。然后,我们将数字中的零去掉,对其进行排序并重新组装。重新组装时,我们使用第一个数字,然后添加回我们的零,最后加上剩余的排序数字。
num = '56340902138765401345'

nzeros = num.count('0')
num = ''.join(sorted(num.replace('0', '')))
print num[0] + ('0' * nzeros) + num[1:]

结果:

 10001233344455566789

我做了完全相同的事情 XD - Jose Ricardo Bustos M.
我投了反对票,但在你之前的回答中,现在让我点赞,直到你编辑。 - Jose Ricardo Bustos M.

3

有一些小问题可以改进。

a = list(num)
a.sort()

可以被替换为

a = sorted(num)

使用''.join(sorted(num)可以从列表中重构字符串。

将其组合在一起,您可以使用正则表达式将前导零移动到第一个非零数字后面:

import re
a = re.sub(r'^(0+)(.)', r'\2\1', ''.join(sorted(num)))

我不会争论这种方法是否更符合Python的风格,但它非常简洁,可能更加优雅(这取决于观察者的眼光)。


我喜欢你的回答,但我认为使用正则表达式比OP原始方法不太符合Pythonic。 - Marcus Müller
@MarcusMüller:是的,我同意这不是特别符合Python的风格。 - mhawke
这很优雅,但我宁愿在不必要时不使用re(因为Zawinski的名言浮现在脑海中...) - frost

0

怎么样?

num = "".join(sorted(num))
nonzero = num.rfind("0") + 1
if nonzero:
    num[0] = num[nonzero]
    num[nonzero] = "0"

如果num中没有“0”,那么rfind返回-1,因此nonzero将评估为False。

0
def Function():
    num=int(input("Enter your number: "))
    num1=str(num)
    list1=[]
    count1=0
    for i in num1:
        if i == "0":
            count1 += 1
        else:
            list1.append(int(i))

    list1.sort()
    s = ""
    if count1 > 0:
        for i in range(len(list1)):
            if i == 0:
                s += str(list1[i])
                for j in range(count1):
                    s += "0"
            else:
                s += str(list1[i])
    else:
        for i in list1:
            s += str(i)
        print(int(s))


if __name__=="__main__":
    Function()

当代码附带解释时,它会更有帮助。Stack Overflow是关于学习的,而不是提供盲目复制和粘贴的片段。请编辑您的问题并解释它如何回答特定的问题。请参见[答案]。 - Chris

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