Сортировка списков, не прибегая к функции.sort или sorted (Python 3.6)
Учитывая список людей, в случайной последовательности мне нужно написать функцию, которая сортирует людей и возвращает список, чтобы старшие люди находились в начале списка. Если мой ввод равен [("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
. Где ошибка в моем коде и как ее исправить?
Я бы использовал встроенную 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
Обратите внимание, что я копирую исходный список, чтобы убедиться, что функция возвращает новый список, а не просто опустошает исходный список.
надеюсь, это поможет
lst.remove(oldest)
new_lst.append(oldest)
с отступом слишком много.