Python 基于2个属性进行排序

Python 基于2个属性进行排序,python,python-3.x,sorting,Python,Python 3.x,Sorting,我正在尝试按字典顺序(反向)对数字进行排序,从最短的数字到最长的数字。 因此,例如,数字9989989,9应重新设置为9989989 我正在尝试以下代码: a.sort(key=lambda x:([x[i] for i in range(len(x))],len(x)), reverse=True) 但只有当数字长度相同时,它才能起到正确的作用。我应该如何修复它,使较短的数字出现在较长的数字之前(即99之前的9)?类似的内容 a = ['9989', '989', '999', '8', '

我正在尝试按字典顺序(反向)对数字进行排序,从最短的数字到最长的数字。 因此,例如,数字
9989989,9
应重新设置为
9989989

我正在尝试以下代码:

a.sort(key=lambda x:([x[i] for i in range(len(x))],len(x)), reverse=True)
但只有当数字长度相同时,它才能起到正确的作用。我应该如何修复它,使较短的数字出现在较长的数字之前(即99之前的9)?

类似的内容

a = ['9989', '989', '999', '8', '9'] 
max_a = len(max(a, key=len))  
sorted(a, key=lambda x: x + 'a'*(max_a - len(x)), reverse=True)
# ['9', '999', '9989', '989', '8']

在Python3中,如果不使用比较器函数,然后使用将其转换为键函数,则很难为这种排序编写有意义的键函数

检查哪些项目的长度大于其最小长度(使用
zip
以最小长度在两个站点上迭代),如果两者相同,则检查其长度:

from functools import cmp_to_key

def comparator(x, y):
   if x == y: return 0
   for i, j in zip(x, y):
      if i != j:
         return int(j)-int(i) # the reversal is done here
   return 1 if len(x) > len(y) else -1


t = '9989', '989', '9'
print(sorted(t, key=cmp_to_key(comparator)))
# ['9', '9989', '989']

t = '888', '9989', '989', '9', '8'
print(sorted(t, key=cmp_to_key(comparator)))
# ['9', '9989', '989', '8', '888']

排序功能可读性很强,当项目相等时不会进一步处理,并且使用
zip
,在最小长度上停止自适应

这是我想到的,与之类似,但避免了双重排序,并使用
int
输入。它需要导入
math.inf
来处理,例如,
[998998999999999]

from math import inf
from functools import partial

a = [9989, 989, 9]

def sort_algo(x, k):
    x_str = list(str(x))
    return list(map(int, x_str)) + [inf]*(k-len(x_str))

n = max(map(len, map(str, a)))
sorter = partial(sort_algo, k=n)
a.sort(key=sorter, reverse=True)

print(a)

[9, 9989, 989]

为什么9989在989之前?因为它们的第一个整数是9,所以我们要检查第二个整数,分别是9和8,所以9989在989之前(请注意事实,我声明了reverse=True),所以根据您的描述,999在8之前?@MosesKoledoye确实我必须将排序(a…)更改为排序(排序(a),…)因为['999','9']会失败,因为'9'在'999'之后,我们将'999'与'999'(对于'9'+'9'*2)进行比较。这是一个不错的解决方案,但排序两次以处理边缘情况不是很好。好的,修复了这个问题。我们可以用例如'a'而不是'9'来填充字符串,因为'a'>'9'。所以我们不需要两次排序。很公平,+1