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

#python #list #sorting

#python #Список #сортировка

Вопрос:

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

 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]
  

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

Комментарии:

1. не связано, но вы перезаписываете свою функцию. Возможно, вы захотите использовать другое имя для переменной.

2. Ваша ключевая функция неверна. Аргументом является не массив целых чисел, а элемент, взятый из массива. Что вы хотите сделать, это обработать одно целое число в качестве входных данных и вернуть сумму цифр этого целого числа.

Ответ №1:

Ключевая функция должна принимать аргумент и возвращать значение для использования в целях сортировки. Вы не должны выполнять итерации по 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]
  

Комментарии:

1. Спасибо, это работает. Также, как бы я поступил, если бы мне пришлось написать программу, которая отображает значения в списке numbers в порядке возрастания, отсортированные по их наибольшему простому множителю

2. @codeybanks Если мой пост отвечает на ваш вопрос, пожалуйста, примите его. Спасибо

Ответ №2:

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

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

С этим изменением sorted(numbers, key=s_num) вернул бы:

 [1108, 1343, 1069, 389, 869]
  

Комментарии:

1. <s_num функции в 0x00000263FBB20840> когда я выполняю вышеуказанное и печатаю sum, и я получаю этот вывод, к сожалению

2. Я не думаю, что вы выполняете мой код правильно. Пожалуйста, запустите демонстрационную версию: repl.it/repls/SpanishPrevailingPublishers

3. Спасибо, это работает. Также, как бы я поступил, если бы мне пришлось написать программу, которая отображает значения в списке numbers в порядке возрастания, отсортированные по их наибольшему простому множителю

4. Рад быть полезным. Поиск наибольшего простого множителя действительно выходит за рамки этого вопроса. Пожалуйста, отправьте новый вопрос, если у вас возникли проблемы с его кодированием самостоятельно.

Ответ №3:

Я думаю, вы упустили из виду правильное использование 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)```
  

Комментарии:

1. Спасибо, это работает. Также, как бы я поступил, если бы мне пришлось написать программу, которая отображает значения в списке numbers в порядке возрастания, отсортированные по их наибольшему простому множителю

Ответ №4:

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

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

Вывод

 [1108, 1343, 1069, 389, 869]
  

Комментарии:

1. Спасибо, это работает. Также, как бы я поступил, если бы мне пришлось написать программу, которая отображает значения в списке numbers в порядке возрастания, отсортированные по их наибольшему простому множителю

Ответ №5:

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

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