给定数字的最小排列

Smallest permutation of given number

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

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 或优雅。有没有更好的方法?

我们可以数零。然后我们从数字中删除零,我们对其进行排序并重新组合。要重新组合,我们使用第一个数字,然后我们加回我们的零,然后是我们排序后的数字的其余部分。

num = '56340902138765401345'

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

结果:

 10001233344455566789

有几个小问题可以改进。

a = list(num)
a.sort()

可以替换为

a = sorted(num)

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

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

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

我不认为这更像 Pythonic,但它非常简洁,而且可能更优雅(这取决于旁观者)。

怎么样

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

如果 num 中没有 "0",则 rfind return -1,因此 nonzero 的计算结果为 False

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()