我正在尝试创建一个python 2.7 tkinter模块,该模块使用比例小部件数据来影响列表理解,该列表理解在概率特征表示为列表列表的动物之间进行选择。单击“提交”并激活关联的命令后,模块将按降序排列并显示三个动物。

在此示例中,所有三个动物在单击“提交”后均处于33%的位置,因为它们共享相同的概率数据。这些动物仅在列表列表的第2列的比例小部件数据之间有所不同,因为它们分别是水生的,陆生的或两者兼有。 通用标签

由于做出了许多贡献,所以此代码有效!

有帮助吗?

解决方案

我注意到的第一件事是,您将A定义为一个空字典,然后使用self.animal(一个列表)覆盖该空字典。 通用标签

所以我不确定您要在这里做什么。然后在您的B定义中将其切成薄片: 通用标签

这与A定义都不相符,因为您无法对字典进行切片,但是您选择的起始索引是3,而self.animal中的最高索引是2。令人困惑!但是更仔细地观察,很明显,问题是您正在重新使用A作为索引变量。您真的不应该那样做;这会使该代码令人难以置信令人困惑。

它也可能导致错误。考虑以下代码: 通用标签

如您所见,列表推导使a引用以前称为a的序列中的最后一个值。在您的代码中不会发生这种情况,因为您使用了生成器表达式。但是,仍然很难阅读和混淆。我强烈建议这样做: 通用标签

更新:好的,进行了这些更改之后,您仍然需要对秤中的数据进行基因标记。在get的定义中,您可以使用self.animal,如下所示: 通用标签

这会将self.soil.get()的返回值放在一个元组中。但是,那个值是固定的-它永远不会改变。您需要每次 显式地调用self.soil.get(),以获取更新后的值。同样,您的列表推导也永远不会访问那里返回的值。您可以像这样切成薄片: 通用标签

请记住,在列表和元组中建立索引始于self.soil.get(),因此在上面的元组中,0l。因此,如果您需要除前两件事之外的所有内容,则必须从索引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部分对我来说似乎有点躲闪。在语法上可能是正确的,但通常更清楚地为集合和这些集合中的元素使用不同的名称。

也可以通过使用for isolates in A: i = A.index(isolates)来使for i, isolates in enumerate(A)更加有效,因为当A大时,A.index(isolates)可能会花费很长时间。

我知道,这不是您问题的真正答案,但我希望它仍然有用。

要使其更容易调试(并切实帮助您),请重写以下内容:

[(A[0], "%.2f" % (reduce(mul,A[3:])*A[2][i]/sigma*A[2][i])) for A in A]

变得更具可读性。如果将其分成多行,则实际上可以使用调试器,并轻松查看什么变量是“浮点数”以及在何处对其进行索引。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top