J'o*_*nzz 26 python for-loop list
我使用wxFormBuilder创建了一个GUI,允许用户在列表中输入"商家访问者"的名称,然后单击两个按钮之一,返回业务中最频繁和最不频繁的访问者.
我创建了一个早期版本,不幸的是,它给了我一系列访问者,而不是最常/最不常访问者的名字.我附上了我创建的GUI的屏幕截图,以帮助增加问题的清晰度(http://imgur.com/XJnvo0U).
一个新的代码版本采用了与早期版本不同的方法,我无法让它抛出任何东西.相反,我一直收到这个错误:
ValueError:max()arg是一个空序列
关于这一行:
self.txtResults.Value = k.index(max(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()
Run Code Online (Sandbox Code Playgroud)
Rav*_*oju 22
如果序列为空default,max则传递一个可以返回的值:
max(v, default=0)
Run Code Online (Sandbox Code Playgroud)
Ash*_*ary 12
因为你总是初始化self.listMyData到一个空列表clkFindMost您的代码将总是导致这个错误*因为后两者unique_names与frequencies空iterables,所以解决这个问题.
另一件事是,因为你在那个方法中迭代一个集合然后计算频率是没有意义的,因为集合只包含唯一的项目,所以每个项目的频率总是为1.
最后dict.get是一个方法而不是列表或字典,所以你不能使用[]它:
正确的方法是:
if frequencies.get(name):
Run Code Online (Sandbox Code Playgroud)
而Pythonic的方式是:
if name in frequencies:
Run Code Online (Sandbox Code Playgroud)
Pythonic获取项目频率的方法是使用collections.Counter:
from collections import Counter #Add this at the top of file.
def clkFindMost(self, parent):
#self.listMyData = []
if self.listMyData:
frequencies = Counter(self.listMyData)
self.txtResults.Value = max(frequencies, key=frequencies.get)
else:
self.txtResults.Value = ''
Run Code Online (Sandbox Code Playgroud)
max()而min()当一个空迭代传递给他们抛出这样的错误.您可以v在呼叫之前检查其长度max().
>>> lst = []
>>> max(lst)
Traceback (most recent call last):
File "<pyshell#2>", line 1, in <module>
max(lst)
ValueError: max() arg is an empty sequence
>>> if lst:
mx = max(lst)
else:
#Handle this here
Run Code Online (Sandbox Code Playgroud)
如果你在迭代器中使用它,那么你需要在调用max()它之前首先使用迭代器,因为迭代器的布尔值总是True如此,所以我们不能if直接使用它们:
>>> it = iter([])
>>> bool(it)
True
>>> lst = list(it)
>>> if lst:
mx = max(lst)
else:
#Handle this here
Run Code Online (Sandbox Code Playgroud)
好消息是,在Python 3.4开始,你将能够指定一个可选的返回值的min()和max()空可迭代的情况下.
小智 6
当 v 的长度为零时,它会给你值错误。
您应该检查长度,或者您应该首先检查列表是否为无。
if list:
k.index(max(list))
Run Code Online (Sandbox Code Playgroud)
或者
len(list)== 0
Run Code Online (Sandbox Code Playgroud)
在一行中,
v = max(v) if v else None
>>> v = []
>>> max(v)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: max() arg is an empty sequence
>>> v = max(v) if v else None
>>> v
>>>
Run Code Online (Sandbox Code Playgroud)