【问题标题】:Python program gives me range of items instead of most/least frequent itemPython程序给了我一系列的项目而不是最频繁/最不频繁的项目
【发布时间】:2014-11-25 20:01:42
【问题描述】:

我已经使用 wxFormBuilder 创建了一个 GUI,它应该允许用户将“企业访问者”的名称输入到列表中,然后单击两个按钮中的一个来返回访问该企业的最频繁和最不频繁访问者。不幸的是,当我单击按钮时,它给了我访问者的范围,而不是最常/最不常访问者的名称。我附上了我创建的 GUI 的屏幕截图,以帮助澄清问题,并附加了我的代码。提前感谢您对此提供的帮助。

代码:

import wx
import myLoopGUI

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):
        word_amount = range(self.listMyData.GetCount())
        numberofitems = self.listMyData.GetCount()
        unique_words = []
        for word in word_amount:
                if word not in unique_words:
                    unique_words += [word]
        word_frequencies = []
        for word in unique_words:
            word_frequencies += [float(word_amount.count(word))/len(word_amount)]

        max_index = 0
        frequent_words =[]
        for i in range(len(unique_words)):
            if word_frequencies[i] >= word_frequencies[max_index]:
                max_index = i
                frequent_words += [unique_words[max_index]]
        self.txtResults.Value = str(frequent_words)



myApp = wx.App(False)
myFrame = MyLoopFrame(None)
myFrame.Show()
myApp.MainLoop()

@Yep_It's_Me 非常友好地插话并提供了另一种前进方式:

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()

但现在我收到一个值错误:

ValueError: max() arg 是一个空序列

关于这条线:

**self.txtResults.Value = k.index(max(v))**

没关系! @Yep_It's_Me 提供了一个绝妙的解决方案。非常感谢。

【问题讨论】:

    标签: python list loops range


    【解决方案1】:
    range(self.listMyData.getCount())
    

    将给出从0self.listMyData.getCount() 的整数列表。

    您想计算self.listMyData 中每个唯一项目的出现次数吗?

    更新:从 cmets 中,self.listMyData 是文本框,而不是名称列表,从文本框中获取名称列表如 this answer 所示。更新了代码。

    # Get the list of names from the textbox
    name_list = 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
    

    现在frequencies 将是名称的字典,其值是该名称在self.listMyData 中的频率

    那么你可以这样做:

    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]
    

    这将为counts 分配一个整数列表,代表names 中每个名称的频率。在counts 中获取最大值和最小值的索引告诉我们在names 中的索引分别具有最频繁和最不频繁的名称。然后我们就可以正常访问了。

    【讨论】:

    • 这似乎是朝着正确方向迈出的一步,但是当我运行此代码时,我不断收到此错误:unique_names = set(self.listMyData) TypeError: 'ListBox' object is not iterable
    • 当然,当我更改为 set[self.listMyData] 我得到 TypeError: 'type' object is not subscriptable
    • 什么是self.listMyData?是清单吗?还是在 GUI 中显示名称的文本框?
    • 这是在 GUI 中显示列表的文本框 (wxListBox) 的名称。我会在构造结束时添加 .Value 吗?
    • 如果.value 为您提供了包含在文本框中的列表,那么是的。 set(self.listMyData.value) 只是获取列表并将其转换为一个集合,其中不能有重复的元素。所以它只能将类似列表的对象作为参数。 set[self.listMyData] 不起作用,因为您尝试将 set 作为列表访问,但事实并非如此。
    猜你喜欢
    • 2018-04-22
    • 2011-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-01
    • 2021-04-21
    • 1970-01-01
    相关资源
    最近更新 更多