Python:按特殊顺序对数字进行排序

Python: Sorting numbers in special order

我需要定义一个用于比较的函数和另一个用于排序的函数。

First func - rank(x):
Input: rank(x1) > rank(x2)
Output: True/False

比较是根据整数x中'1'的个数进行比较,与位数无关,因此,111 > 999991。如果1的个数相同,则比较下一个高位数字,(即2 的数量,然后是 3 的数量...)等等(例如 9321 > 14249)。 如果两个数的位数相同,则进行普通整数比较 987>789.

Second func - sort(values):
Input: sort(n1,n2,n3,n4..)
Output: (values in ranking of the above mentioned order)

简单地使用rank(x)。

def sort(values):
    return sorted(values, key=rank)

例子

input: sort([12, 91, 81, 49, 1111, 7, 37, 9999, 777])
output: [9999, 7, 777, 49, 37, 91, 81, 12, 1111]

input: sort([1234, 4321, 3214, 2413])
output: [1234, 2413, 3214, 4321]

我卡在了 return 应该代表 rank(x) 的地方。我猜我应该 return 一个比较值。 我的想法是从创建每个 x 的元组开始,先转换为字符串,然后再转换为列表。但是,没有关于如何继续的具体想法。

L=[]
for i in values:
    L.append(tuple(sorted(str(i),reverse=True)))
print(L)

由于长度不同导致低于 returns 的错误

def rank(x):
    return x[0], x[1], x[2]

sorted(L, key=rank)

这是一个可能的解决方案:

sorted(inp, key=lambda x: tuple((*(str(x).count(str(i)) for i in range(1,10)), x)))

基本上,rank(x) 函数创建一个元组,其中第 i 个元素等于 x 中的 (i+1) 位数。元组的第 9 个元素包含 x 本身。例如:

x = 1456556
rank(x) = (1, 0, 0, 1, 3, 2, 0, 0, 0, 1456556)

之后,使用元组的标准比较。