我正在尝试按字典顺序(反向)对数字进行排序,从最短到最长。
因此,例如,数字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)?
答案 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]