【问题标题】:counting occurrences of items in an array python计算数组python中项目的出现次数
【发布时间】:2014-03-18 23:09:55
【问题描述】:

这个程序的目的是读入一个文件,把所有的单词变成单独的标记,然后把这些标记放到一个数组中。然后程序会删除所有标点符号并将所有字母更改为小写。然后程序应该计算每个命令行参数在数组中出现的次数,并打印结果。我的程序能够成功创建一个不带标点符号的小写标记数组。我现在的问题是如何遍历数组并计算特定单词的出现次数,以及我应该如何在主函数中调用这些函数。我的 depunctuate 函数按书面方式工作

这是我的程序:

import sys
from scanner import *

def main():
    print("the name of the program is",sys.argv[0])
    for i in range(1,len(sys.argv),1):
        print("   argument",i,"is", sys.argv[i])
    tokens = readTokens("text.txt")
    cleanTokens = depunctuateTokens(tokens)
    words = [token.lower() for token in cleanTokens]
    count = find(words)
    print(words)
    print(count)
def readTokens(s):
    arr=[]
    s=Scanner("text.txt")
    token=s.readtoken()
    while (token != ""):
        arr.append(token)
        token=s.readtoken()
    s.close()
    return arr

def depunctuateTokens(arr):
    result=[]
    for i in range(0,len(arr),1):
        string=arr[i]
        cleaned=""
        punctuation="""!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~"""
        for i in range(0,len(string),1):
            if string[i] not in punctuation:
                cleaned += string[i]
        result.append(cleaned)
    return result

def find(tokens,words):
    return occurences(tokens,words)>0

def occurences(tokens,words):
    count = 0
    for i in range(0,len(words),1):
        if (words[i] == tokens):
            count += 1
        return count

main()

【问题讨论】:

  • 乍看之下,与your previous question相比,您似乎并没有自己完成任何工作。你拿了那里给你的代码,然后问如何添加它来解决你的下一个家庭作业。如果这不准确,你真的应该阅读MCVE(正如我上次告诉你的那样),并给我们一个重点示例,只展示你需要编写的部分、到目前为止你尝试过的内容以及你在哪里得到的卡住了。
  • 你是对的。对于那个很抱歉。阅读 MCVE 并删除此问题。

标签: python arrays loops python-3.x


【解决方案1】:

使用list.count

>>> l = [1,2,3,4,5,6,7,44,4,4,4,4]
>>> print(l.count(4))
>>> 5

【讨论】:

    【解决方案2】:

    您现有的功能并不太遥远:

    def occurences(tokens,words):
        count = 0
        for i in range(0,len(words),1):
            if (words[i] == tokens):
                count += 1
            return count
    

    第一个问题是您在for 循环内缩进了return count。这意味着每次循环都会return,这意味着它只会处理第一个单词。因此,如果第一个单词匹配,它将返回 1,否则返回 0。只需取消 return 的缩进,问题就会消失。


    第二个问题是,从参数名称来看,您期望tokenswords 都是字符串列表。因此,单个词 words[i] 永远不会匹配整个令牌列表。也许您想测试该词是否与 列表中的任何标记 匹配,而不是它是否与列表匹配?在这种情况下,你会写:

    if words[i] in tokens:
    

    最后,虽然您的 find 函数似乎正确地调用了 occurences(好吧,您拼写 occurrences 错误,但您始终如此,所以没关系),您实际上并没有正确地调用 find,所以你永远不会到这里。您的调用如下所示:

    count = find(words)
    

    ……但是你的定义是这样的:

    def find(tokens,words):
    

    您必须将 something 传递给 tokens 参数。我不确定要传递什么——但你是设计和编写这段代码的人;你写这个函数是为了什么?


    我怀疑您真正要查找的是每个令牌的计数。在这种情况下,根据您的设计,findoccurrences 实际上都应该采用单个token,而不是tokens 的列表作为参数。在这种情况下,您想要上面的in 表达式,您想要重命名参数。而你对find 没有用处,你只想直接打电话给occurences。你想在一个循环中调用它,像这样:

    for word in words:
        count = occurences(word, words)
        print('{}: {}'.format(word, count))
    

    而且,正如您的其他两个函数正在复制已经内置的函数(str.translatelower),这个也是:list.count。如果您应该出于学习目的自己编写它,那很好,但如果这不是作业的一部分,请使用内置函数。

    【讨论】:

      猜你喜欢
      • 2014-10-16
      • 2011-07-02
      • 2011-12-27
      • 1970-01-01
      • 2011-02-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多