我使用wxFormBuilder创建了一个GUI,该GUI允许用户在列表中输入“某个企业的访问者”的名称,然后单击两个按钮之一返回该企业最频繁和最不频繁的访问者。
我创建了一个早期版本,不幸的是,它给了我访问的范围,而不是最频繁/最少访问的人的名字。我附上了一个我创建的GUI的屏幕截图,以帮助为这个问题添加一点清晰性(http://imgur.com/XJnvo0U)。
一个新的代码版本需要一个不同于早期版本的策略,我不能让它抛出任何东西。相反,我一直收到这个错误:
值错误:max()arg是一个空序列
关于这一行:
self.txtResults.Value=k.索引(最大值(v))
import wx
import myLoopGUI
import commands
class MyLoopFrame(myLoopGUI.MyFrame1):
def __init__(self, parent):
myLoopGUI.MyFrame1.__init__(self, parent)
def clkAddData(self,parent):
if len(self.txtAddData.Value) != 0:
try:
myname = str(self.txtAddData.Value)
self.listMyData.append(str(myname))
except:
wx.MessageBox("This has to be a name!")
else:
wx.MessageBox("This can't be empty")
def clkFindMost(self, parent):
self.listMyData = []
unique_names = set(self.listMyData)
frequencies = {}
for name in unique_names:
if frequencies.get[name]:
frequencies[name] += 1
else:
frequencies[name] = 0
v = list(frequencies.values())
k = list(frequencies.keys())
self.txtResults.Value = k.index(max(v))
def clkFindLeast(self, parent):
unique_names = set(self.listMyData)
frequencies = {}
for name in unique_names:
if frequencies.get(name):
frequencies[name] += 1
else:
frequencies[name] = 0
v = list(frequencies.values())
k = list(frequencies.keys())
self.txtResults.Value = k.index(min(v))
myApp = wx.App(False)
myFrame = MyLoopFrame(None)
myFrame.Show()
myApp.MainLoop()
由于您总是初始化
self.listMyData
到clkFindMost
中的空列表,您的代码将始终导致此错误*,因为在此之后unique_names
和frequencies
都是空的iterable,所以请修复此问题。另一件事是,由于在该方法中迭代一个集合,所以计算频率毫无意义,因为集合只包含唯一的项,所以每个项的频率总是为1。
最后,
dict.get
是一个方法,而不是一个列表或字典,因此不能对它使用[]
:正确的方法是:
而Python的方式是:
获取项目频率的python方法是使用^{} :
max()
和min()
在向它们传递空iterable时抛出此类错误。在调用max()
之前,可以检查v
的长度。如果将其与迭代器一起使用,则需要先使用迭代器,然后再对其调用
max()
,因为迭代器的布尔值始终是True
,因此不能直接对其使用if
:好消息是,从Python 3.4开始,在iterable为空的情况下,您将能够为
min()
和max()
使用specify an optional return value。当v的长度为零时,它会给你数值误差。
你应该检查一下表的长度,或者你应该先检查一下它是否是无的。
或者
在一行中
v = max(v) if v else None
相关问题 更多 >
编程相关推荐