计算数组python中项的出现次数

时间:2014-02-18 22:14:05

标签: python arrays loops python-3.x

此程序的目的是读入文件,将所有单词更改为单个标记,并将这些标记放入数组中。程序然后删除所有标点符号并将所有字母更改为小写。然后程序应该计算每个命令行参数在数组中出现的次数,并打印结果。我的程序能够成功创建一个depunctuated,小写令牌数组。我现在的问题是如何遍历数组并计算特定单词的出现次数,以及如何在main函数中调用这些函数。我的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()

2 个答案:

答案 0 :(得分:2)

使用list.count

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

答案 1 :(得分:0)

您现有的功能并不太远:

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

第一个问题是你在return count循环中缩进了for。这意味着每次循环都会return,这意味着它只会处理第一个单词。因此,如果第一个单词匹配则返回1,否则返回0。只是return并且那个问题消失了。


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

if words[i] in tokens:

最后,虽然您的find函数似乎正确地调用了occurences(好吧,你拼写occurrences错了,但是你这样做了一致,所以没关系),你实际上并没有正确地打电话给find,所以你永远不会到这里来。您的电话如下:

count = find(words)

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

def find(tokens,words):

您必须将某些内容传递给该tokens参数。我不确定要传递什么 - 但你是设计和编写此代码的人;你为这个函数写了什么?


我怀疑你真正寻找的是每个令牌的数量。在这种情况下,根据您的设计,findoccurrences实际上应该只使用一个token,而不是tokens列表作为参数。在这种情况下,您想要上面的in表达式,您想要重命名参数。并且您对[{1}}没有用处,您只想直接致电find。你想在循环中调用它,如下所示:

occurences

而且,就像你的其他两个函数正在复制已经内置的函数(for word in words: count = occurences(word, words) print('{}: {}'.format(word, count)) str.translate)一样,这个函数也是:lower。如果您是出于学习目的而自己编写的,那很好,但如果这不是作业的一部分,只需使用内置函数。