使用tkinter Scale小部件数据进行列表理解
-
29-10-2019 - |
题
我正在尝试创建一个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()
,因此在上面的元组中,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
部分对我来说似乎有点躲闪。在语法上可能是正确的,但通常更清楚地为集合和这些集合中的元素使用不同的名称。
也可以通过使用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]
变得更具可读性。如果将其分成多行,则实际上可以使用调试器,并轻松查看什么变量是“浮点数”以及在何处对其进行索引。