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

问题描述 投票:0回答:3
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 list sorting
3个回答
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
投票

我会用字符串来代替。喜欢:

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


0
投票

我认为这是一个很好的案例,

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]

© www.soinside.com 2019 - 2024. All rights reserved.