ValueError:max()arg是一个空序列

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

如果序列为空defaultmax则传递一个可以返回的值:

max(v, default=0)
Run Code Online (Sandbox Code Playgroud)


Ash*_*ary 12

因为你总是初始化self.listMyData到一个空列表clkFindMost您的代码将总是导致这个错误*因为后两者unique_namesfrequencies空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)


Moh*_*med 5

在一行中,

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)