ValueError:max()arg是空序列

2024-03-28 17:03:36 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用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()

Tags: nameimportself版本namesvaluedefgui
3条回答

由于您总是初始化self.listMyDataclkFindMost中的空列表,您的代码将始终导致此错误*,因为在此之后unique_namesfrequencies都是空的iterable,所以请修复此问题。

另一件事是,由于在该方法中迭代一个集合,所以计算频率毫无意义,因为集合只包含唯一的项,所以每个项的频率总是为1。

最后,dict.get是一个方法,而不是一个列表或字典,因此不能对它使用[]

正确的方法是:

if frequencies.get(name):

而Python的方式是:

if name in frequencies:

获取项目频率的python方法是使用^{}

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 = '' 

max()min()在向它们传递空iterable时抛出此类错误。在调用max()之前,可以检查v的长度。

>>> 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

如果将其与迭代器一起使用,则需要先使用迭代器,然后再对其调用max(),因为迭代器的布尔值始终是True,因此不能直接对其使用if

>>> it = iter([])
>>> bool(it)
True
>>> lst = list(it)
>>> if lst:
       mx = max(lst)
    else:
      #Handle this here   

好消息是,从Python 3.4开始,在iterable为空的情况下,您将能够为min()max()使用specify an optional return value

当v的长度为零时,它会给你数值误差。

你应该检查一下表的长度,或者你应该先检查一下它是否是无的。

if list:
    k.index(max(list))

或者

len(list)== 0

在一行中

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
>>> 

相关问题 更多 >