Сортировка списков, не прибегая к функции.sort или sorted (Python 3.6)

79
8

Учитывая список людей, в случайной последовательности мне нужно написать функцию, которая сортирует людей и возвращает список, чтобы старшие люди находились в начале списка. Если мой ввод равен [("M", 23), ("F", 19), ("M", 30)], моя функция должна возвращать [("M", 30), ("M", 23), ("F", 19)]. Моя функция такова:

def sort_age(lst):
new_lst=[]
while lst:
max_age = lst[0][1]
oldest = lst[0]
counter = len(lst)-1
while counter > 0:
if lst[counter][1] > max_age:
max_age = lst[counter][1]
oldest = lst[counter]
counter-=1
lst.remove(oldest)
new_lst.append(oldest)
return new_lst

Python IDLE выдает значение ValueError: list.remove(x): x not in list. Где ошибка в моем коде и как ее исправить?

спросил(а) 2021-01-19T15:31:07+03:00 9 месяцев назад
1
Решение
113

Я бы использовал встроенную sorted чтобы избежать повторного использования колеса:

lst = [("M" , 23), ("F" , 19), ("M" , 30)]
print(sorted(lst, key=lambda x: x[1], reverse=True))

# [('M', 30), ('M', 23), ('F', 19)]

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

def sort_by_age(local_lst):
local_lst = local_lst[:]
output = []
while True:
if len(local_lst) == 0:
break
oldest = local_lst[0]
max_age = oldest[1]
for tpl in local_lst[:]:
if tpl[1] > max_age:
max_age = tpl[1]
oldest = tpl
output.append(oldest)
local_lst.remove(oldest)
return output

lst = [("M" , 23), ("F" , 19), ("M" , 30)]
print(sort_by_age(lst))

# [('M', 30), ('M', 23), ('F', 19)]

Один момент, который поможет вам понять, почему ValueError исключение ValueError, в основном состоит в том, что .append и .remove выполняются во втором while loop. Это по существу собирается опустошить список еще до того, как он перейдет на вторую итерацию первого while loop. Поскольку второй while loop используется для определения текущего значения max_age, лучше всего переместить операции .append и .remove за пределы цикла, чтобы вы .remove фактический максимальный кортеж.

Следующее ближе всего к тому, с чего вы начали:

def sort_age(lst):
local_list = lst[:]
new_lst=[]
while len(local_list) != 0:
max_age = local_list[0][1]
oldest = local_list[0]
counter = len(local_list)-1
while counter >= 0:
if local_list[counter][1] > max_age:
max_age = local_list[counter][1]
oldest = local_list[counter]
counter -= 1
local_list.remove(oldest)
new_lst.append(oldest)
return new_lst

Обратите внимание, что я копирую исходный список, чтобы убедиться, что функция возвращает новый список, а не просто опустошает исходный список.

надеюсь, это поможет

ответил(а) 2021-01-19T15:31:07+03:00 9 месяцев назад
47

        lst.remove(oldest)
new_lst.append(oldest)

с отступом слишком много.

ответил(а) 2021-01-19T15:31:07+03:00 9 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема