此程序的目的是读入一个标记数组,删除标点符号,将所有字母小写,然后打印生成的数组。 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()
答案 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()