根据2个属性排序

时间:2018-10-13 10:07:32

标签: python python-3.x sorting

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

我正在尝试以下代码:

a.sort(key=lambda x:([x[i] for i in range(len(x))],len(x)), reverse=True)

,但是只有当数字长度相同时,它才能正确执行。我应该如何解决,以便较短的数字出现在较长的数字之前(即99之前为9)?

3 个答案:

答案 0 :(得分:4)

像这样吗?

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']

答案 1 :(得分:1)

您很难在Python 3中为这种类型的排序编写有意义的 key 函数,而无需借助比较器函数然后使用functools.comp_to_key来进行排序进入关键功能。

检查哪个项目最大长度不超过其最小长度(使用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时,最小长度停止; 自适应

答案 2 :(得分:1)

这是我想出的,与@Andyk's solution类似,但是避免了双重排序并使用function display_clear(){ var colours = ["red", "green", "blue", "orange"]; var x; for (x = 0; x <= colours.length; x++){ colour = document.getElementById(colours[x]); colour.style.backgroundColor = default_background; colour.style.boxShadow = default_shadow; } 输入。它需要导入int来处理例如math.inf

[9989, 989, 999, 9, 99]