Сортировка по весу
Надо написать функцию, которая сортирует список положительных чисел.
Критерий сортировки - возрастание веса числа (сумма всех цифр числа).
Если два числа имеют одинаковый вес, сортировать их так, словно они строки.
Я попытался решить эту задачу следующим образом:
import traceback
num_weight = lambda x: sum(int(i) for i in str(x))
def order_weight(integers):
for i in range(len(integers)-1):
if num_weight(integers[i]) < num_weight(integers[i+1]):
integers.sort(key=num_weight)
elif num_weight(integers[i]) == num_weight(integers[i+1]):
sorted(integers)
print(integers)
return integers
# Тесты
try:
assert order_weight([103, 123, 4444, 99, 2000])
== [2000, 103, 123, 4444, 9 9]
assert order_weight([2000, 10003, 1234000, 44444444, 9999, 11, 11, 22, 123] ) ==
[11, 11, 2000, 10003, 22, 123, 1234000, 44444444, 9999]
except AssertionError:
print("TEST ERROR")
traceback.print_exc()
else:
print("TEST PASSED")
Чем можно заменить функцию sorted() в строке elif num_weight(integers[i])...,
чтобы сортировка элементов с одинаковыми весами как сортировка строк выполнялась верно?
Вот вывод программы при использовании функции sorted():
[2000, 103, 123, 4444, 99]
[2000, 11, 11, 10003, 22, 123, 1234000,44444444, 9999]
TEST ERROR
Traceback (most recent call last): File "task489.py", line 28, in <module>
assert
order_weight([2000, 10003, 1234000, 44444444, 9999, 11, 11, 22, 123])
== [11, 11, 2000, 10003, 22, 123, 1234000, 44444444, 9999]*
AssertionError
Ответы (2 шт):
Python использует стабильный алгоритм сортировки, поэтому можно сначала отсортировать список как строки. После этого можно сортировать полученный список по сумме цифр:
def order_weight(integers):
res = sorted([str(x) for x in integers])
res = sorted(res, key=lambda x: sum(int(d) for d in x))
return res
Всё проще, sorted может принимать tuple в качестве ключа сортировки и таким образом мы можем сортировать сразу по нескольким ключам одновременно:
def order_weight(integers):
return sorted(integers, key = lambda x: (sum(int(i) for i in str(x)), str(x)))
Результат:
TEST PASSED