Функция Python sort_insertion работает не так, как я хочу, чтобы она работала

#python #insertion-sort

#python #вставка-сортировка

Вопрос:

Мне нужно создать этот алгоритм вставки сортировки для uni, и у меня возникли проблемы с выяснением, почему выполнение этого кода дает «None».

Я бы хотел, чтобы она выдавала мне вывод в такой форме:

 [Product(name='banana', price=3.99), Product(name='peanut butter', price=4.2), Product(name='jelly', price=5.99), Product(name='Phoebe Bridgers CD', price=8.2), Product(name='guitar strings', price=12)]

 

Мой код:

 from typing import List
from dataclasses import dataclass


# dataclasses are a convenient new way to create simple "structs" or "records"
# in Python.
@dataclass
class Product:
    name: str
    price: float


# hint: lst is a python list, so use lst[i] to access element i
# (=what we called "get" in class), and use len(lst) to get its size.

# insertion sort


def sort_insertion(lst: List[Product]) -> List[Product]:
    """Sort lst by insertion, in-place."""


    # We start from 1 since the first element is already sorted as it is.
    for i in range(1, len(lst)):
        cur_value = lst[i].price
        cur_pos = i - 1

        while cur_pos >= 0 and cur_value < lst[cur_pos].price:
            lst[cur_pos   1].price = lst[cur_pos].price
            cur_pos -= 1

        lst[cur_pos   1].price = cur_value

sample_inventory = [
        Product(name="banana", price=5.99),
        Product(name="peanut butter", price=8.20),
        Product(name="jelly", price=3.99),
        Product(name="Phoebe Bridgers CD", price=12),
        Product(name="guitar strings", price=4.20),
    ]

print(sort_insertion(sample_inventory))
 

Комментарии:

1. Ваш sort_insertion() метод ничего не return делает.

2. Спасибо!! Это решило проблему

Ответ №1:

Вот оно. Было три проблемы: 1. В первой строке цикла while вам нужно выполнить замену, как показано ниже. 2. вы хотите поменять местами весь продукт, а не только его цену. Вы не хотите, чтобы цена бананов и других товаров менялась в процессе сортировки. 3. Это сортировка in_place, поэтому вы не можете сказать print(sort_insertion(sample_inventory)), поскольку функция ничего не возвращает.

 def sort_insertion(lst: List[Product]) -> List[Product]:
    """Sort lst by insertion, in-place."""
    # We start from 1 since the first element is already sorted as it is.
    for i in range(1, len(lst)):
        cur_value = lst[i].price
        cur_pos = i - 1

        while cur_pos >= 0 and cur_value < lst[cur_pos].price:
            lst[cur_pos   1], lst[cur_pos] = lst[cur_pos], lst[cur_pos   1]
            cur_pos -= 1

        lst[cur_pos   1].price = cur_value

sample_inventory = [
        Product(name="banana", price=5.99),
        Product(name="peanut butter", price=8.20),
        Product(name="jelly", price=3.99),
        Product(name="Phoebe Bridgers CD", price=12),
        Product(name="guitar strings", price=4.20),
    ]

sort_insertion(sample_inventory)
print(sample_inventory)

#output:
[Product(name='jelly', price=3.99), Product(name='guitar strings', price=4.2), Product(name='banana', price=5.99), Product(name='peanut butter', price=8.2), Product(name='Phoebe Bridgers CD', price=12)]