提问人:RealGonPC 提问时间:11/17/2023 最后编辑:Goku - stands with PalestineRealGonPC 更新时间:11/17/2023 访问量:70
按数字总和对数组整数进行排序,如果两个整数具有相同的数字总和,则按值降序排序 [duplicate]
Sort array integers by digits sum, or by value descending if two integers have the same digits sum [duplicate]
问:
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)
答:
0赞
S.B
11/17/2023
#1
我会使用字符串。喜欢:
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
2赞
Goku - stands with Palestine
11/17/2023
#2
要反转第二个元素中的元素,您可以使用第二个元素中的符号。-
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
编辑:找到相关问题 https://stackoverflow.com/a/37693603/13086128
0赞
Woodford
11/17/2023
#3
我认为这是一个很好的案例,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]
下一个:创建监视列表功能
评论
x /= 10
x
x
x //= 10
1 26 89 111 26
1 111 26 26 89
reversed
sort