Вопрос

Я пытаюсь создать модуль tkinter python 2.7, который использует данные масштабного виджета, чтобы влиять на понимание списка, которое выбирает между животными, чьи вероятностные черты представлены в виде списка списков.Модуль сортирует и отображает трех животных в порядке убывания ранжирования после нажатия кнопки «Отправить» и активации соответствующей команды.

В этом примере все три животных имеют 33% после нажатия кнопки "Отправить", потому что у них одинаковые данные о вероятности.Животные различаются только данными масштабного виджета в столбце 2 списка списков тем, что каждое из них является либо водным, либо наземным, либо и тем, и другим.

общий

Благодаря множеству внесенных улучшений этот код работает!

Это было полезно?

Решение

Первое, что я заметил, это то, что вы определяете A как пустой словарь, а затем перезаписываете этот пустой словарь с помощью self.animal, который представляет собой список.

общий

Я не совсем понимаю, что вы собираетесь здесь делать. Затем в вашем определении B вы его разрезаете:

общий

Это не согласуется с либо определением A, потому что вы не можете разрезать dict, но вы выбрали начальный индекс 3, а наивысший индекс в self.animal - 2. Сбивает с толку! Но если присмотреться, становится ясно, что проблема в том, что вы повторно используете A в качестве индексирующей переменной. Вы действительно не должны этого делать; это делает этот код невероятно запутанным.

Это также может вызвать ошибки. Рассмотрим этот код:

общий

Как видите, понимание списка заставляет a ссылаться на последнее значение в последовательности, ранее известной как a. Этого не происходит в вашем коде, потому что вы использовали выражение генератора. Но все равно сложно читать и запутывать. Я настоятельно рекомендую сделать следующее:

общий

Обновление . Хорошо, после внесения этих изменений вам все еще нужно сгенерировать кодирование данных с весов. В вашем определении get вы используете self.animal, например:

общий

Это помещает возвращаемое значение self.soil.get() в кортеж. Но тогда это значение фиксировано - оно никогда не изменится. Вы должны явно вызывать self.soil.get() каждый раз , когда вам нужно обновленное значение. Кроме того, ваши списки никогда не обращаются к возвращаемому там значению. Вы нарезаете их так:

общий

Помните, что индексация в списках и кортежах начинается с self.soil.get() - поэтому в приведенном выше кортеже 0, l. Итак, если вам нужно все, кроме первых двух вещей, вы должны вырезать из индекса 2:

общий

Но это все еще не решает основную проблему, заключающуюся в том, что вам нужно вызвать l[0] == 'Odocoileous virginiana' для получения обновленных данных. Один из способов сделать это - просто воссоздавать self.soil.get() каждый раз, когда нажимается кнопка отправки. Это было бы расточительно, но это сработает. Менее расточительным (но все же неудобным) подходом было бы сохранение самой функции в кортеже, а не результата функции. Вы бы сделали это так:

общий

Обратите внимание на отсутствие кода self.animal после кода (). Теперь кортеж содержит не значение с плавающей запятой, а функцию, возвращающую значение с плавающей запятой. Вы должны вызвать его, чтобы получить значение, но он каждый раз возвращает полностью обновленное значение. Чтобы комбинировать функции, вы можете использовать self.soil.get:

общий

Теперь вы можете вызвать lambda, чтобы получить значение:

общий

Итак, чтобы собрать все вместе, вам нужно немного разбить понимание списка, чтобы явно вызвать l[2], но как только вы это сделаете, это должно сработать. Это не идеальная установка, но, боюсь, мне придется оставить создание улучшенной архитектуры в качестве упражнения для читателя.

Другие советы

A[2][i]/sigma*A[2][i] этот бит пытается проиндексировать число с плавающей запятой. Следует ли использовать вместо этого: A[i]/sigma*A[i]?

Я сделал предположение, что все значения в A являются плавающими.

Часть общего кодового кода мне кажется немного сложной.Это может быть синтаксически корректным, но обычно проще использовать разные имена для коллекций и элементов в этих коллекциях.

Кроме того, генерацию кода

Я знаю, что не совсем ответ на ваш вопрос, но тем не менее надеюсь, что он полезен.

Чтобы упростить отладку (и действительно помочь вам), перепишите это:

for A in A

во что-то более читаемое.Если вы разделите его на что-то с несколькими строками, вы действительно можете использовать отладчик и легко увидеть, какая переменная является «плавающей» и где она индексируется.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top