Отображение функции по всем буквам маркера в python

Цель этой программы – прочитать в массиве токенов, удалить пунктуацию, повернуть все буквы в нижнем регистре и затем распечатать полученный массив. функции readTokens и depunctuateTokens работают нормально. Моя проблема заключается в декапитализации функции Tokens. Когда я запускаю программу, я получаю эту ошибку:

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 Solutions collect form web for “Отображение функции по всем буквам маркера в python”

Функция 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 – как на основе ее множественного имени, так и на том факте, что у вас есть точно такие же петли в аналогичной функции depunctuateTokens . Если вы depunctuateTokens decapitalizeTokens же, как вы построили depunctuateTokens , то ваш существующий звонок работает нормально:

 words = decapitalizeTokens(cleanTokens) 

Как примечание, встроенный lower метод в строках уже делает то, что вы хотите, поэтому вы можете заменить весь этот беспорядок:

 words = [token.lower() for token in cleanTokens] 

… который также исправит неприятную ошибку в вашей попытке. Подумайте, что, скажем, decapitalizeTokens будет делать с цифрой или пробелом.

И, таким же образом, depunctuateTokens можно заменить аналогичным образом вызовом метода translate . Например (немного отличается для Python 2.x, но вы можете прочитать документы и понять это):

 punctuation="""!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~""" punctmap = {ord(char): None for char in punctuation} cleanTokens = [token.translate(punctmap) for token in cleanTokens] 

cleanTokens = depunctuateTokens (…) # возвращает массив в cleantokens.
words = decapitalizeTokens (cleanTokens) # принимает массив и возвращает … что угодно.

дело в том, что в

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

результатом является массив (cleanTokens), а ord (result) терпит неудачу, так как он ожидает строку, а не массив.

возможно, выполнение слов = map (decapitalizeTokens, cleanTokens) может помочь вам

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

Как использовать Django 1.8.5 ORM без создания проекта django?

Python – ввод пользователя для имени переменной, передаваемой в качестве аргумента функции

Как де-импортировать модуль Python?

Python сокол и асинхронные операции

Pandon pandas не имеет атрибутов ols – Error (roll OLS)

Передача содержимого функции другого модуля в Python

Почему статическое связывание работает по-разному для класса и функции?

Многопроцессорная обработка занимает больше времени, чем многопроцессорность – Python

Python for Loop List Интересный результат

Чтение тела POST с бутылкой.

Создание PDF из XML с помощью XSL FO w / Python

Почему bivariate_normal возвращает NaN, даже если ковариация полуположительна?

выяснить, работает ли скрипт python в режиме ожидания или командной строки терминала / командной строки

В Matplotlib есть ли способ узнать список доступных форматов вывода

Сортировка массива 2D numpy несколькими осями

Python - лучший язык программирования в мире.