def sumdigit(x):
S = 0
while x != 0:
S += x % 10
x /= 10
return S
L = [int(x) for x in input().split()]
L.sort(key=lambda x: (sumdigit(x), (x, reversed == True)))
print(*L)
我已经尝试实现它,但它没有按预期工作,忽略第二个参数,
(x, reversed == True)
。
要反转第二个元素中的元素,您可以在第二个元素中使用
-
符号。
def sumdigit(x):
S = 0
while x != 0:
S += x%10; x //= 10
return S
L = [int(x) for x in input().split()]
L.sort(key = lambda x : (sumdigit(x), -x))
print(*L)
input: 11 45 20 810 179 81 1000
output : 1000 20 11 810 81 45 179
我会用字符串来代替。喜欢:
inp = "9 41 50 23 32 111".split()
def sorter_func(x: str) -> tuple[int, int]:
digit_sum = sum(map(int, x))
return digit_sum, -int(x)
inp.sort(key=sorter_func)
print(inp)
输出:
['1000', '20', '11', '810', '81', '45', '179']
它唯一的一点是对元组中的第二项使用否定,以便它为您提供降序排列。
您稍后可以将它们转换回
int
。
functools.cmp_to_key
可以澄清你的意图:
import functools
def sumdigit(x):
S = 0
while x != 0:
S += x%10
x //= 10
return S
def my_cmp(a, b):
x = sumdigit(a)
y = sumdigit(b)
if x == y:
return -1 if a > b else 1
else:
return -1 if x < y else 1
L = [1, 3, 4, 12, 13, 14, 30, 21]
print(sorted(L, key=functools.cmp_to_key(my_cmp)))
---
[1, 30, 21, 12, 3, 13, 4, 14]