web-dev-qa-db-ja.com

ValueError:max()argは空のシーケンスです

WxFormBuilderを使用してGUIを作成しました。これにより、ユーザーは「ビジネスの訪問者」の名前をリストに入力し、2つのボタンのいずれかをクリックしてビジネスに最も頻繁に訪問する訪問者を返すことができます。

残念ながら、最も頻繁に/最も頻繁に訪れる訪問者の名前ではなく、訪問者の範囲を提供する以前のバージョンを作成しました。問題を少し明確にするために作成したGUIのスクリーンショットを添付しました( http://imgur.com/XJnvo )。

新しいコードバージョンは、以前のバージョンとは異なる方法を採用しており、何も投げることができません。代わりに、私はこのエラーを受け取り続けます:

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()
24
J'onn J'onzz

常にself.listMyDataclkFindMostの空のリストに初期化するため、コードは常にこのエラーにつながります。その後、unique_namesfrequenciesの両方が空のイテラブルであるため、これを修正します。

もう1つは、そのメソッドでセットを反復処理するため、セットには一意のアイテムのみが含まれるため、頻度の計算は意味をなさないため、各アイテムの頻度は常に1になります。

最後に、dict.getはリストでも辞書でもないメソッドなので、[]を使用することはできません。

正しい方法は次のとおりです。

if frequencies.get(name):

そして、Pythonの方法は次のとおりです。

if name in frequencies:

アイテムの頻度を取得するPython的な方法は、 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 = '' 

max()およびmin()は、空のイテラブルが渡されたときにこのようなエラーをスローします。 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

イテレータで使用している場合、イテレータのブール値は常にTrueであるため、max()を呼び出す前にイテレータを最初に消費する必要があります。したがって、直接ifを使用することはできません。

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

良いニュースはPython 3.4から開始できます オプションの戻り値を指定min()およびmax()に対して)空のイテラブルの場合。

11

一行で

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

Vの長さがゼロになると、値のエラーが発生します。

長さをチェックするか、リストが存在するかどうかを最初にチェックする必要があります。

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

または

len(list)== 0
4
Aamish Baloch