2014-10-02 127 views
0

我已經創建了一個使用wxFormBuilder的GUI,它應該允許用戶在列表中輸入「業務訪問者」的名稱,然後單擊兩個按鈕之一以返回最多頻繁和最不頻繁的業務訪客。這裏看一下GUI:http://imgur.com/XJnvo0U最大和最小頻率都返回相同的值

不幸的是,最大和最小按鈕都拋出相同的值(大多數)。我認爲這與頻率如何加權輸入有關,也許與clkFindMost和clkFindLeast事件的定義重疊有關。任何幫助將不勝感激。

**編輯:我非常新的Python,和學習曲線陡峭

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): 
     name_list = set(self.listMyData.GetStrings()) 
     unique_names = set(name_list) 
     frequencies = {} 
     for name in unique_names: 
      if frequencies.get(name): 
       frequencies[name] += 1 
      else: 
       frequencies[name] = 0 

     counts = list(frequencies.values()) 
     names = list(frequencies.keys()) 
     max_count_index = counts.index(max(counts)) 
     min_count_index = counts.index(min(counts)) 
     most_frequent = names[max_count_index] 
     least_frequent = names[min_count_index] 
     self.txtResults.Value = most_frequent 



    def clkFindLeast(self, parent): 
     name_list = set(self.listMyData.GetStrings()) 
     unique_names = set(name_list) 
     frequencies = {} 
     for name in unique_names: 
      if frequencies.get(name): 
       frequencies[name] += 1 
      else: 
       frequencies[name] = 0 

     counts = list(frequencies.values()) 
     names = list(frequencies.keys()) 
     max_count_index = counts.index(max(counts)) 
     min_count_index = counts.index(min(counts)) 
     most_frequent = names[max_count_index] 
     least_frequent = names[min_count_index] 
     self.txtResults.Value = least_frequent 

    def clkClear (self, parent): 
     self.txtResults.SetValue("") 

#Needed to ensure the program runs   
myApp = wx.App(False) 
myFrame = MyLoopFrame(None) 
myFrame.Show() 
myApp.MainLoop() 

回答

0

編輯:在我原來的答案,我專注於錯誤的問題。

首先,迭代一組唯一名稱來確定頻率是沒有意義的。而是應該將遍歷所有的名字,如:

name_list = self.listMyData.GetStrings() # presuming this is an iterable 
    frequencies = {} 
    for name in name_list: 
     if frequencies.get(name): 
      frequencies[name] += 1 
     else: 
      frequencies[name] = 0 

即使你的任務不允許它,我會離開這個對於薰陶:
你想做的事在collections.defaultdict提供什麼樣的一流解決方案如果它不存在則創建一個關鍵字,如果它存在則創建一個關鍵字。由於collections.defaultdict的子類dict您以後在代碼中使用的dict方法仍然有效。

import collections as co # at top of script 
# ... 
    name_list = self.listMyData.GetStrings() # presuming this is an iterable 
    frequencies = co.defaultdict(int) 
    for name in name_list: 
     frequencies[name] += 1 
+0

Ohhhh,好的。我現在明白了。我該如何糾正這一點? (就像我之前提到的,我對Python非常陌生) – 2014-10-02 01:29:33

+0

這非常瞭解。不幸的是,我必須保持for循環和if/else結構作爲這個任務的一部分。有沒有一種非「優雅」的方式來解決這個問題? – 2014-10-02 01:45:06

+0

我修改了我的答案。問題是你正在遍歷唯一的名字,但你真的想遍歷非單一列表。 – bernie 2014-10-02 02:14:18