按数字总和对数组整数进行排序,如果两个整数具有相同的数字总和,则按值降序排序 [duplicate]

Sort array integers by digits sum, or by value descending if two integers have the same digits sum [duplicate]

提问人:RealGonPC 提问时间:11/17/2023 最后编辑:Goku - stands with PalestineRealGonPC 更新时间:11/17/2023 访问量:70

问:

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)

python-3.x 列表 排序

评论

2赞 Yevhen Kuzmovych 11/17/2023
您应该始终包括“它不起作用”的确切含义。我假设它转换为浮点数并且永远不会达到 0。尝试x /= 10xxx //= 10
0赞 RealGonPC 11/17/2023
我指定,在排序时,它忽略了第二个参数:(x, reversed == True)
0赞 Janez Kuhar 11/17/2023
对于此输入:您的代码输出:.你期待什么?1 26 89 111 261 111 26 26 89
2赞 Scott Hunter 11/17/2023
忽略了第二个参数,还是只是没有按照你想要的方式使用它?例如,粘贴在元组内部不会告诉以相反的顺序排序。reversedsort
0赞 RealGonPC 11/17/2023
对于“11 45 20 810 179 81 1000”,它输出“1000 11 20 45 81 810 179”,而它应该输出:“1000 20 11 810 81 45 179”。请注意,810、81 和 45 具有相同的数字总和,因此按值降序排序。

答:

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]