A. B. Dinshaa Ответов: 4

Как исправить ошибку в этом коде?


def greedy_cow_transport(cows,limit=10):
    train = []
    while sum(cows.values()) > 0:
        cart = []
        total = 0
        for cow, value in sorted(cows.items(), key=lambda x:x[1], reverse=True):
            if cows[cow] != 0 and value + total <= limit:
                cart.append(cow)
                total += value
                cows[cow] = 0
        train.append(cart)
    return train

The code above gives the output:

[['Betsy', 'Henrietta', 'Herman', 'Oreo', 'Millie', 'Maggie', 'Moo Moo', 'Milkshake', 'Lola', 'Florence']]

I want output to be displayed as shown below:

[['Betsy'],
 ['Henrietta'],
 ['Herman', 'Maggie'],
 ['Oreo', 'Moo Moo'],
 ['Millie', 'Milkshake', 'Lola'],
 ['Florence']] 

How to display this way? Is this going to be counted in greedy algorithm?


Что я уже пробовал:

Я пробовал жадный алгоритм, но не смог заставить его работать, он не дает результата. Он показывает только "нет".

Patrice T

И вход был ...

Richard MacCutchan

Это секрет.

4 Ответов

Рейтинг:
25

Patrice T

Цитата:
Как исправить ошибку в этом коде?

Вы забыли дать нам рабочий фрагмент кода, мы не можем проверить ваш код.

Ваш код ведет себя не так, как вы ожидаете, или вы не понимаете, почему !

Существует почти универсальное решение: запускайте свой код на отладчике шаг за шагом, проверяйте переменные.
Отладчик здесь, чтобы показать вам, что делает ваш код, и ваша задача-сравнить с тем, что он должен делать.
В отладчике нет никакой магии, он не знает, что должен делать ваш код, он не находит ошибок, он просто помогает вам, показывая, что происходит. Когда код не делает того, что ожидается, вы близки к ошибке.
Чтобы увидеть, что делает ваш код: просто установите точку останова и посмотрите, как работает ваш код, отладчик позволит вам выполнять строки 1 на 1 и проверять переменные по мере их выполнения.

Отладчик - Википедия, свободная энциклопедия[^]

Освоение отладки в Visual Studio 2010 - руководство для начинающих[^]
Базовая отладка с помощью Visual Studio 2010 - YouTube[^]

27.3. ПДБ — отладчика Python — питон 3.6.1 документации[^]
Отладка в Python | Python покоряет Вселенную[^]
pdb – интерактивный отладчик - Python модуль недели[^]

Отладчик здесь только для того, чтобы показать вам, что делает ваш код, и ваша задача-сравнить его с тем, что он должен делать.


A. B. Dinshaa

Мне нужен второй вывод, а не первый вывод, который уже дает код. Ты хоть представляешь, что нужно изменить? Есть ли у вас что - нибудь еще, кроме отладчика, чтобы достичь требуемого вывода, так как отладчик займет много времени, чтобы понять....

Patrice T

ДАЙ ВХОД!!!

A. B. Dinshaa

Вы имеете в виду файл словаря? или текстовый файл, на котором я хочу сделать реализацию кода?

Patrice T

Все, что необходимо для запуска вашего кода и получения желаемого результата.
в том числе и код вызова.

A. B. Dinshaa

Ок спасибо понял. Нужно научиться использовать отладчик для того, чтобы отслеживать ошибки.

A. B. Dinshaa

Вы что-то говорили о словаре. После того, что я опубликовал ниже, мне нужно сделать то же самое с txt-файлом или словарем, а затем сравнить их. Для сравнения нужно отобразить количество поездок, возвращаемых каждым методом, и сколько времени каждый метод занимает для запуска в секундах. Какие методы python использовать???????????????????

Patrice T

Я ничего не говорил о словаре, но ты сказал.

A. B. Dinshaa

Для приведенного ниже алгоритма грубой силы для транспортировки коров мой друг предложил приведенный ниже код, но он также имеет ту же проблему, что и более крупный:
коровы = {"Джесси": 6, "Мейбел": 3, "Кэлли": 2, "Мэгги": 5}
вес деф(суб):
сумма = 0
для e в sub:
сумма += коров[электронный]
возврат суммы

valid_trips = []
для части в списке(get_partitions(cows)):
если все(вес(sub) <= предел для sub в части):
valid_trips.append(часть)
мин(valid_trips, ключ=лен)

печать(вес(коров))

Patrice T

Можете ли Вы, наконец, пять входных данных для этого результата ?
[["Бетси"],
["Генриетта"],
["Герман", "Мэгги"],
["Орео", "Му-Му"],
["Милли", "Молочный Коктейль", "Лола"],
["Флоренция"]]

A. B. Dinshaa

Я надеюсь, что смогу дать тот результат, который вы указали. Использование списка для отображения ответа и получение входных данных из списка, написанного в коде, - это две разные вещи, поэтому я упомянул словарь. Отображение выходных данных, которые вы указали в моем вопросе, легко и может быть отображено путем записи списка в коде. Список легко, но из словаря может потребоваться время.

Рейтинг:
2

OriginalGriff

Компиляция не означает, что ваш код верен! :смеяться:
Подумайте о процессе разработки как о написании электронного письма: успешная компиляция означает, что вы написали письмо на правильном языке - например, на английском, а не на немецком, - а не то, что письмо содержало сообщение, которое вы хотели отправить.

Итак, теперь вы входите во вторую стадию разработки (на самом деле это четвертая или пятая, но вы перейдете к более ранним стадиям позже): тестирование и отладка.

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

Input   Expected output    Actual output
  1            2                 1
  2            4                 4
  3            6                 9
  4            8                16
Тогда совершенно очевидно, что проблема заключается в бите, который удваивает его - он не прибавляет себя к себе или умножает его на 2, он умножает его на себя и возвращает квадрат входного сигнала.
Таким образом, вы можете посмотреть на код, и очевидно, что он находится где-то здесь:
int Double(int value)
   {
   return value * value;
   }

Как только у вас появится идея, что может пойти не так, начните использовать отладчик, чтобы выяснить, почему. Поместите точку останова в первую строку метода и запустите приложение. Когда он достигнет точки останова, отладчик остановится и передаст управление вам. Теперь вы можете запускать свой код построчно (так называемый "одноступенчатый") и просматривать (или даже изменять) содержимое переменных по мере необходимости (черт возьми, вы даже можете изменить код и повторить попытку, если вам это нужно).
Подумайте о том, что должна делать каждая строка кода перед ее выполнением, и сравните это с тем, что она действительно делала, когда вы использовали кнопку "шаг вперед" для выполнения каждой строки по очереди. Он сделал то, что вы ожидали? Если да, то переходите к следующей строке.
Если нет, то почему? Чем это отличается?
Надеюсь, это поможет вам определить, в какой части этого кода есть проблема и в чем она заключается.
Это навык, и его стоит развивать, поскольку он помогает вам как в реальном мире, так и в развитии. И, как и все навыки, он только улучшается при использовании!


A. B. Dinshaa

Вы хотите сказать, что если я смогу дать результат, приведенный выше, я могу дать все результаты, это зависит только от использования, которое улучшит навык. Так ведь?????

OriginalGriff

Нет - я говорю, что вам нужно использовать отладчик, чтобы точно изучить, что делает ваш существующий код, и использовать эту информацию, чтобы понять, почему он не работает...

Рейтинг:
12

A. B. Dinshaa

Я надеюсь, что смогу дать тот результат, который вы указали. Использование списка для отображения ответа и получение входных данных из списка, написанного в коде, - это две разные вещи, поэтому я упомянул словарь. Отображение выходных данных, которые вы указали в моем вопросе, легко и может быть отображено путем записи списка в коде. Список легко, но из словаря может потребоваться время.


Richard MacCutchan

Почему вы разместили этот комментарий здесь, это не решение проблемы? Если вы хотите, чтобы его увидел человек, с которым вы пытаетесь поговорить, то используйте кнопку ответа на комментарий этого человека.

A. B. Dinshaa

ладно

Рейтинг:
1

Patrice T

Второй ответ после вашего решения.
Объединив этот вопрос, я думаю, что наконец понял, что вы пытаетесь сделать.

Первое правило:
- Когда вы задаете вопрос людям, не знающим, что вы пытаетесь сделать, убедитесь, что в вопросе есть все необходимое. Когда вы перечитываете свой вопрос, если вам нужно какое-то другое знание, чтобы понять его, чего-то не хватает.
Пример: не давая вход, соответствующий желаемому выходу вопроса, Вы убедитесь, что никто ничего не может с ним сделать, таким образом, невозможно проверить ваш код.

Этот ввод слишком упрощен и не может быть использован для проверки чего-либо:

limit, cows = 10, {"Jesse": 6, "Maybel": 3, "Callie": 2, "Maggie": 5}

Некоторые скажут вам, что [["Джесси"], ["Мэйбел", "Кэлли", "Мэгги"]] - лучшее решение.

В принципе, ваша проблема соответствует задаче IP (целочисленное программирование), 1D CSP (проблема резки запаса) или упаковке бункера.
Целочисленное программирование - Википедия[^]
Проблема резки запасов - Википедия[^]
Проблема упаковки бункера - Википедия[^]

Ваш алгоритм не жадный, это FF (First Fit) или FFD (First Fit Reducing), если входные данные уже отсортированы.
Жадный алгоритм строит решение, многократно создавая лучший бункер (минимальные потери) с оставшимися коровами.