2014-10-01 6 views
14

मैंने wxFormBuilder का उपयोग करके एक GUI बनाया है जिसे किसी उपयोगकर्ता को "किसी व्यवसाय के विज़िटर" के नाम दर्ज करने की अनुमति देनी चाहिए और उसके बाद दो बटनों में से एक को क्लिक करने के लिए क्लिक करें व्यापार के लिए सबसे अधिक बार और कम से कम लगातार आगंतुकों।ValueError: max() arg एक खाली अनुक्रम है

मैंने पहले के संस्करण को बनाया है, दुर्भाग्य से, मुझे सबसे कम/कम से कम लगातार आगंतुक के नाम के बजाय आगंतुकों की श्रेणी दी गई है। मैंने जीयूआई का एक स्क्रीनशॉट संलग्न किया है जिसे मैंने इस मुद्दे पर थोड़ा स्पष्टता जोड़ने में मदद के लिए बनाया है (http://imgur.com/XJnvo0U)।

एक नया कोड संस्करण पिछले संस्करण की तुलना में एक अलग tack लेता है, और मैं इसे कुछ भी फेंकने के लिए नहीं मिल सकता।

ValueError:

self.txtResults.Value = k.index (अधिकतम: अधिकतम() आर्ग एक खाली अनुक्रम

इस लाइन के संबंध में है इसके बजाय, मैं यह संदेश मिल रहा रखने के लिए (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() 
+0

जब 'LEN (v) == 0',' clkFindMost' में, 'अधिकतम (v)' को जन्म देती है 'ValueError'। स्पष्टीकरण के लिए –

उत्तर

6

जब से तुम हमेशा clkFindMost में एक खाली सूची self.listMyData initialising कर रहे हैं अपने कोड हमेशा इस त्रुटि को बढ़ावा मिलेगा * क्योंकि उसके बाद unique_names और frequencies खाली पुनरावृत्त हैं, इसलिए इसे ठीक करें।

एक और बात यह है कि जब से तुम उस विधि में एक सेट से अधिक पुनरावृत्ति कर रहे हैं तो की गणना आवृत्ति कोई मतलब नहीं है सेट के रूप में केवल अद्वितीय आइटम होते हैं, इसलिए प्रत्येक आइटम की आवृत्ति हमेशा होने के लिए 1.

अन्त में dict.get जा रहा है है

सही तरीका है::

if frequencies.get(name): 

और pythonic तरीका है:

एक विधि नहीं किसी सूची या शब्दकोश जिससे कि आप इससे [] उपयोग नहीं कर सकते है
if name in frequencies: 

मदों की आवृत्ति प्राप्त करने के लिए 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 = '' 

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 

अच्छी खबर अजगर 3.4 से शुरू कर रहा है आप खाली iterable के मामले में min() और max() के लिए specify an optional return value में सक्षम हो जाएगा।

+0

धन्यवाद। जब मैंने अपना पीईक्यूटी एप्लीकेशन बंद कर दिया तो एक समान मुद्दा था और अधिकतम को खाली सूची में बुलाया गया था। –

4

जब वी की लंबाई शून्य होगी, तो यह आपको मूल्य त्रुटि देगा।

आपको लंबाई की जांच करनी चाहिए या आपको पहले सूची की जांच करनी चाहिए चाहे वह कोई नहीं है या नहीं।

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

या

len(list)== 0 
संबंधित मुद्दे