在python中将函数映射到令牌的所有字母

时间:2014-02-18 01:07:39

标签: python arrays token

此程序的目的是读入一个标记数组,删除标点符号,将所有字母小写,然后打印生成的数组。 readTokens和depunctuateTokens函数都能正常工作。我的问题是decapitalizeTokens函数。当我运行程序时,我收到此错误:

the name of the program is words.py
['hello', 'hello1', 'hello2']
Traceback (most recent call last):
  File "words.py", line 41, in <module>
    main()    
  File "words.py", line 10, in main
    words = decapitalizeTokens(cleanTokens)
  File "words.py", line 35, in decapitalizeTokens
    if (ord(ch) <= ord('Z')):
TypeError: ord() expected string of length 1, but list found

我的问题是我应该在decapitalizeTokens函数中添加什么形式参数,以便返回由depunctuateTokens函数生成的数组,但所有字母都是小写的。

这是我的计划:

import sys
from scanner import *
arr=[]
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(arr)
    words = decapitalizeTokens(cleanTokens)

def readTokens(s):
    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)
    print(result)
    return result

def decapitalizeTokens(result):
    if (ord(result) <= ord('Z')):
        return chr(ord(result) + ord('a') - (ord('A')))
    else:
        print(result)
        return result


main()

3 个答案:

答案 0 :(得分:2)

您的decapitalizeTokens功能适用于单个角色。你传给它一个字符串列表。如果要在该列表中的每个字符串的每个字符上调用它,则需要遍历列表,然后在某处循环遍历每个字符串。

您可以使用显式循环语句执行此操作,如下所示:

words = []
for token in tokens:
    word = ''
    for char in token:
        word += decaptializeTokens(char)
    words += word

......或使用理解:

words = [''.join(decapitalizeTokens(char) for char in token) 
         for token in cleanTokens]

但是,我认为将循环移动到decapitalizeTokens函数更有意义 - 这两者都基于其复数名称,以及在类似命名的{中具有完全相同的循环的事实{1}}功能。如果您构建depunctuateTokens的方式与构建decapitalizeTokens的方式相同,那么您现有的调用工作正常:

depunctuateTokens

作为旁注,字符串上的内置lower方法已经实现了您想要的功能,因此您可以用以下内容替换整个混乱:

words = decapitalizeTokens(cleanTokens)

...这也可以解决你尝试中的一个令人讨厌的错误。考虑一下words = [token.lower() for token in cleanTokens] 对数字或空格的影响。

同样地,decapitalizeTokens也可以通过调用translate方法来代替。例如(对于Python 2.x略有不同,但您可以阅读文档并弄清楚):

depunctuateTokens

答案 1 :(得分:-1)

cleanTokens = depunctuateTokens(...)#将数组返回到cleantokens。
words = decapitalizeTokens(cleanTokens)#takes数组并返回......无论如何。

事实是在

def decapitalizeTokens(result):
    if (ord(result) <= ord('Z')):
        return chr(ord(result) + ord('a') - (ord('A')))
    else:
        print(result)
        return result

result是一个数组(cleanTokens),而ord(result)失败,因为它需要一个字符串,而不是一个数组。

也许做单词= map(decapitalizeTokens,cleanTokens)可以帮到你

答案 2 :(得分:-1)

import scanner
import string
import sys

def read_tokens(fname):
    res = []
    with scanner.Scanner(fname) as sc:
        tok = sc.readtoken()
        while tok:
            res.append(tok)
            tok = sc.readtoken()
    return res

def depunctuate(s):
    return s.translate(None, string.punctuation)

def decapitalize(s):
    return s.lower()

def main():
    print("The name of the program is {}.".format(sys.argv[0]))
    for arg in enumerate(sys.argv[1:], 1):
        print("  Argument {} is {}".format(i, arg))

    tokens = read_tokens("text.txt")
    clean_tokens = [depunctuate(decapitalize(tok)) for tok in tokens]

if __name__=="__main__":
    main()