Python 频率的最大值和最小值都返回相同的值

Python 频率的最大值和最小值都返回相同的值,python,loops,max,frequency,min,Python,Loops,Max,Frequency,Min,我已经使用wxFormBuilder创建了一个GUI,它应该允许用户在列表中输入企业访问者的姓名,然后单击两个按钮中的一个按钮返回企业最频繁和最不频繁的访问者。下面是GUI的一个视图: 不幸的是,“最多”和“最少”按钮最多抛出相同的值。我认为这与频率如何加权输入有关,可能与clkFindMost和clkFindMost事件的定义重叠有关。任何帮助都将不胜感激 **编辑:我对Python非常陌生,学习曲线非常陡峭 import wx import myLoopGUI import commands

我已经使用wxFormBuilder创建了一个GUI,它应该允许用户在列表中输入企业访问者的姓名,然后单击两个按钮中的一个按钮返回企业最频繁和最不频繁的访问者。下面是GUI的一个视图:

不幸的是,“最多”和“最少”按钮最多抛出相同的值。我认为这与频率如何加权输入有关,可能与clkFindMost和clkFindMost事件的定义重叠有关。任何帮助都将不胜感激

**编辑:我对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()

编辑:在我最初的回答中,我把重点放在了错误的问题上

首先,迭代一组唯一的名称来确定频率是没有意义的。您应该迭代所有名称,例如:

    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

哦,好的。我现在明白了。我怎样才能纠正这个问题?就像我之前提到的。我对蟒蛇很陌生,很高兴知道这一点。不幸的是,作为此任务的一部分,我必须维护for循环和if/else构造。有没有不优雅的方法来解决这个问题?我修改了我的答案。问题是你在迭代唯一的名字,但你真的想迭代非唯一的列表。这太棒了。非常感谢你的帮助,我真的很感激。有这样一个社区可以学习真是太棒了。干杯,伙计。很高兴见到你。