2014-10-02 1 views
0

wxFormBuilder를 사용하여 사용자가 "비즈니스 방문객"의 이름을 목록에 입력하고 두 버튼 중 하나를 클릭하여 가장 많은 것을 반환 할 수있게하는 GUI를 만들었습니다 빈번하고 가장 적게 자주 방문하는 비즈니스. 다음은 GUI를 보여줍니다. http://imgur.com/XJnvo0U최대 및 최소 주파수 모두 동일한 값 반환

불행하게도 Most 버튼과 Least 버튼은 같은 값 (Most)을 던지고 있습니다. 주파수가 입력에 가중치를 부여하는 방식과 clkFindMost 및 clkFindLeast 이벤트의 정의가 겹치는 방식과 관련이 있다고 생각합니다. 어떤 도움이라도 대단히 감사하겠습니다.

** 편집 : 나는 파이썬에 매우 새로운 오전 및 학습 곡선은 가파른

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

오, 오케이. 이제 이해가된다. 이 문제를 어떻게 해결할 수 있습니까? (내가 전에 언급했듯이, 나는 Python을 처음 사용했다.) –

+0

이것은 알아두면 좋을 것이다. 불행히도이 과제의 일부로 for 루프와 if/else 구조를 유지해야한다. 이것을 해결할 수있는 "우아하지 않은"방법이 있습니까? –

+0

나는 내 대답을 개정했다. 문제는 고유 한 이름을 반복하고 있지만 실제로는 uniqified 목록을 반복하고 싶다는 것입니다. – bernie

관련 문제