#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))
или использовать один из предложенных ответов, опубликованных здесь .