【问题标题】:Max and Min of Frequency Both Returning Same Value频率的最大值和最小值都返回相同的值
【发布时间】:2024-01-22 17:41:01
【问题描述】:

我已经使用 wxFormBuilder 创建了一个 GUI,它应该允许用户将“企业访问者”的名称输入到列表中,然后单击两个按钮中的一个来返回访问该企业的最频繁和最不频繁访问者。下面看一下 GUI:http://imgur.com/XJnvo0U

不幸的是,Most 和 Least 按钮都抛出相同的值(Most)。我认为这与频率如何加权输入有关,并且可能与 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()

【问题讨论】:

    标签: python loops max frequency min


    【解决方案1】:

    编辑:在我原来的答案中,我专注于错误的问题。

    首先,遍历一组唯一名称以确定频率是没有意义的。相反,您应该遍历所有名称,例如:

        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.defaultdictdict 的子类,因此您稍后在代码中使用的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
    

    【讨论】:

    • 哦,好吧。我现在明白了。我该如何纠正这个问题? (就像我之前提到的。我对 Python 很陌生)
    • 很高兴知道这一点。不幸的是,我必须维护 for 循环和 if/else 构造作为这项任务的一部分。有没有一种非“优雅”的方式来解决这个问题?
    • 我修改了我的答案。问题是您正在迭代唯一名称,但您确实想要迭代非唯一列表。
    • 这太棒了。非常感谢您的帮助,我真的很感激。有这样一个社区可供学习真是太棒了。
    • 干杯,伙计。祝您编码愉快。