Сортировка списка по части елемента нижеописанным алгоритмом
Есть список out = ['123 700', '456 -300', '789 -200'] состоящий из 3 элементов разделенных точкой с запятой. Каждый элемент - это номер счета - пробел - сумма. Нужно отсортировать список по сумме таким алгоритмом: Проходим циклом по всем элементам и сохраняем в переменную вне цикла элемент с минимальной суммой. После выполнения цикла записываем эту сумму в новый список outsort и удаляем ее из out. У меня все работает правильно, но строка с удалением ломает алгоритм, как изменить код, чтоб удалять правильно?
out = ['123 700', '456 -300', '789 -200']
q = 1
minn = "999 99999999"
i_minn = 0
outsort = []
while q <= len(out):
for i in range(len(out)):
if int(minn[4:]) > int(out[i][4:]):
minn = out[i]
i_minn = i
outsort.append(minn)
del out[i_minn]
q += 1
print(out)
print(outsort)
['123 700', '456 -300', '789 -200'] - исходный список
['456 -300', '789 -200', '123 700'] - ожидаемый список
['456 -300', '456 -300'] - то что получается этим кодом
Ответы (2 шт):
Так надо, если алгоритм не менять (и фраза "строка с удалением ломает алгоритм" сбивает с толку - с этой строкой всё нормально):
out = ['123 700', '456 -300', '789 -200']
# Тут не нужен i_minn
outsort = []
# Поменяли неверное условие выхода и убрали лишний счетчик
while len(out):
# Поменяли минимальный элемент
minn = '999 999999999'
for i in range(len(out)):
if int(minn[4:]) >= int(out[i][4:]):
minn = out[i]
i_minn = i
outsort.append(minn)
del out[i_minn]
print(out)
print(outsort)
Если поменять алгоритм:
out = ['123 700', '456 -300', '789 -200']
outsort = sorted(out, key=lambda x: int(x[4:]))
print (outsort)
out = ['123 700', '456 -300', '789 -200']
dictionary = {int(x): int(y) for x, y in [(x.split(' ')[0], x.split(' ')[1]) for x in out]}
sorted_dict = sorted(dictionary.items(), key=lambda x: x[1])
sorted_dict = [' '.join(x) for x in [(str(x), str(y)) for x, y in sorted_dict]]
print(sorted_dict)
Вывод, как вы и хотели - ['456 -300', '789 -200', '123 700']. В строке объявления dictionary генерируем словарь по "вторым объектам" строки с помощью генератора словаря и вложенного в него генератора списков. В следующей строке сортируем этот список. Затем склеиваем с помощью ' '.join(x) и принтим список, который вам нужен.