2016-08-30 2 views
0

Я пытался создать программу, которая должна быть прочитана в файле, найти уникальные слова и знаки препинания, поместить их в список, а затем получить позиции каждого слова и сохранить их в списке. Затем, используя списки, программа заново создаст файл. Это мой код:Python List: Index out of Range

import time 
import re 
words = open('words.txt') 
sentence = words.read() 
uniquewords = [] 
positions = [] 
punctuation = re.findall(r"[\w']+|[.,!?;]", sentence) 
for word in punctuation: 
    if word not in uniquewords: 
     uniquewords.append(word) 
print("This file contains the words and punctuation ", uniquewords) 
positions = [uniquewords.index(word) for word in punctuation] 
recreated = " ".join([uniquewords[i] for i in positions]) 
print("In a list the text file words.txt can be shown as:") 
print(positions) 
print("Recreating sentence...") 
print(recreated) 

Программа выше делает то, что ему нужно, за исключением того, что производит следующий вывод:

Этот файл содержит слова и знаки препинания [ «Ask», «не», 'что', 'ваш', 'страна', 'может', 'делать', 'за', 'ты', '', '!']

В списке в текстовых файлов слов. txt может быть обозначен как:

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 2, 8, 5, 6, 7, 3, 4, 10]

Воссоздание предложение ...

Не спрашивай, что твоя страна может сделать для вас, спросите, что вы можете сделать для твоя страна !

Список позиций начинается с 0, так как обычно я попытался просто сделать это:

positions = [uniquewords.index(word)+1 for word in punctuation] 

Однако при этом возникает ошибка

File "C:\Users\Sam\Desktop\COMPUTING TEMP FOLDER\task 3.py", line 13, in <module> 
    recreated = " ".join([uniquewords[i] for i in positions]) 
    File "C:\Users\Sam\Desktop\COMPUTING TEMP FOLDER\task 3.py", line 13, in <listcomp> 
    recreated = " ".join([uniquewords[i] for i in positions]) 
IndexError: list index out of range 

Как я могу сделать начало списка на 1 без получения этой ошибки? Любая помощь будет принята с благодарностью.

Еще одна небольшая проблема в том, что в то время как исходная строка является

«Не спрашивай, что твоя страна может сделать для вас, спросите, что вы можете сделать для вашей страны!»

фактический выход вместо

Не спрашивай, что твоя страна может сделать для вас, спросите, что вы можете сделать для своей страны!

+1

Вы знаете, какой формат следует ожидать от входного файла? – LukeBowl

+3

Код, который вы опубликовали, указывает на ошибку, это не тот же код, что и в трассировке. Вероятно, вы должны это обновить. Ваш последний вопрос о дополнительных пространствах состоит в том, что каждое слово (или знак препинания) окружено пробелами из-за вашего 'str.join'. Вам придется делать это по-другому.Кроме того, почему вы пытаетесь переинсталлировать список, чтобы начать с него? Я этого не понимал. – FamousJameous

+0

@FamousJameous Как бы вы предложили сделать это по-другому? – finnadie123

ответ

1

Проблема заключается в том, что вы увеличиваете каждый элемент positions так, чтобы он отображался как 1-индексированный, а затем используя этот массив, когда python ожидает 0-индексацию. Попробуйте использовать:

recreated = " ".join([uniquewords[i-1] for i in positions]) 

вместо

0

Пожалуйста, проверьте код, приведенный ниже. Я изменил бит для воссоздания строки, чтобы решить проблему пространства вместе с проблемой индексирования, с которой вы столкнулись.

import time 
import re 
words = open("val.txt",'r') 
sentence = words.readline() 
uniquewords = [] 
positions = [] 
punctuation = re.findall(r"[\w']+|[.,!?;]", sentence) 
for word in punctuation: 
    if word not in uniquewords: 
     uniquewords.append(word) 
print("This file contains the words and punctuation ", uniquewords) 
positions = [uniquewords.index(word)+1 for word in punctuation] 
#recreated = " ".join([uniquewords[i-1] for i in positions]) 
recreated = '' 
for i in positions: 
    w = uniquewords[i-1] 
    if w not in '.,!?;': 
      w = ' ' + w 
    recreated = (recreated + w).strip() 

print("In a list the text file words.txt can be shown as:") 
print(positions) 
print("Recreating sentence...") 
print(recreated) 

Выход:

C:\Users\dinesh_pundkar\Desktop>python c.py 
('This file contains the words and punctuation ', ['Ask', 'not', 'what', 'your', 
'country', 'can', 'do', 'for', 'you', ',', '!']) 
In a list the text file words.txt can be shown as: 
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 3, 9, 6, 7, 8, 4, 5, 11] 
Recreating sentence... 
Ask not what your country can do for you, Ask what you can do for your country! 
+0

Это не отвечает на вопрос. – mtrw

+0

Обновлен код. Были две проблемы: 1) Связано с индексацией и 2) Связано с отсутствием котировок в конечном выпуске. Сначала я пропустил первую часть. –

+0

@DineshPundkar извинения Я не знаю, почему я помещаю кавычки в исходную строку, фактическая проблема - это пробелы с пунктуацией. – finnadie123