Как мне вернуть отсортированный список суммы чисел в списке? - PullRequest
0 голосов
/ 07 марта 2019

У меня есть список

numbers = [869, 1069, 1108, 1343, 389]

и я хочу отсортировать их в порядке возрастания суммы цифр (например: 8 + 6 + 9 для 869)

Мой вклад:

def s_num(nums):
    result = [sum(int(digit) for digit in str(number)) for number in numbers]
    return result

s_num = sorted(numbers,key=s_num)
print(s_num)

Однако по какой-то причине мой вывод совпадает с моим начальным списком

print(s_num)
[869, 1069, 1108, 1343, 389]

Как мне изменить мой скрипт, чтобы получить правильный отсортированный список?

Ответы [ 5 ]

3 голосов
/ 07 марта 2019

Функция ключа должна принимать аргумент и возвращать значение для использования в целях сортировки.Вы не должны перебирать массив numbers в этой функции.Так сделайте это:

numbers = [869, 1069, 1108, 1343, 389]
def s_num(num):
    return sum(map(int, str(num)))

result = sorted(numbers,key=s_num)
print(result)

ВЫХОД

[1108, 1343, 1069, 389, 869]
3 голосов
/ 07 марта 2019

Вы можете отобразить цифровые символы преобразованного в строку числа в целые числа, чтобы их можно было передать в функцию sum:

def s_num(n):
    return sum(map(int, str(n)))

С этим изменением sorted(numbers, key=s_num) вернется:

[1108, 1343, 1069, 389, 869]
1 голос
/ 07 марта 2019

Ваша функция s_sum (nums) игнорирует полученный параметр (nums) и вычисляет сумму цифр для всех элементов числовой переменной. Это всегда будет один и тот же результат, поэтому ваш список не отсортирован.

Вы можете изменить это на: result = sum(int(digit) for digit in str(nums)) или использовать один из предложенных ответов, опубликованных здесь.

1 голос
/ 07 марта 2019

Вы можете сделать в одной строке с key аргументом

sorted(numbers,key=lambda x:(sum(map(int,str(x)))))

Вывод

[1108, 1343, 1069, 389, 869]
1 голос
/ 07 марта 2019

Я думаю, что вы упустили правильное использование аргумента функции s_num(nums). Более того, отсортированная функция уже проходит по отдельным элементам списка numbers, поэтому вам не нужен вложенный цикл в функции s_num(nums).

def s_num(nums):
    digits = [int(digit) for digit in str(nums) ]
    return sum(digits)

s_num = sorted(numbers,key=s_num)
print(s_num)```
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...