2015-11-09 1 views
-1

Я хочу добавить все слова в текстовый файл в словарь, но только один раз (без повторов) и остальные слова в список. Я выяснил, как это сделать, посмотрев ответы. Вот как выглядел мой код, когда я сдался. Когда я запускаю его в текстовом файле, я получаю keyerror на последнем слове в файле. Этот путь довольно близок к решению, но я не мог заставить его работать правильно, и я не понимаю, почему. Кто-нибудь, пожалуйста, попытайтесь объяснить это мне, чтобы я мог лучше понять. Спасибо.Словарь ключевой ошибки при последнем слове

import sys 

def dictionary(filename): 
    dict = {} 
    list = [] 
    open_file = open(filename, 'rU') 
    for lines in open_file: 
    line = lines.split() 
    for words in line: 
     word = words.lower() 
    if not word in dict: 
     dict[word] 
    else: 
     list.append(word) 
    print (dict) 

filename = sys.argv[1] 

dictionary(filename) 
+0

В вашем коде есть несколько вещей, но это неправильное место для этого вопроса. Этот вопрос нужно перенести в [Кодекс обзора стека Exchange] (http://codereview.stackexchange.com). – augurar

+0

Я думаю, вы хотите, чтобы ваш 'if' был * внутри * цикла' for'. В чем смысл «списка»? И как только вы устанавливаете, что слово «слово» не является ключом 'dict', почему тогда вы запрашиваете значение этого ключа (' dict [word] ')? –

ответ

0

Вы получаете KeyError, потому что вы не назначаете значение для ключа в словаре. Словари в Python лучше всего воспринимать как неупорядоченные множества пар ключ/значение. См. Документацию here.

Вы можете исправить ошибку, назначив Dict [слово] такое значение, как слово:

dict[word] = word 
0

Основываясь на ваш вопрос, мне кажется, что вы на самом деле хотите это set() ("Набор объект является неупорядоченный сбор отдельных хешируемых объектов "). (Прокомментируйте мой ответ, если мое предположение неверно.)

from sys import argv 

def dictionary(filename): 
    words = set() 
    repeats = [] 
    with open(filename, 'rU') as open_file: 
     for line in open_file: 
      for word in line.split(): 
       word = word.lower() 
       if word in words: 
        repeats.append(word) 
       words.add(word) 
    return words 

print dictionary(argv[1]) 

Были проблемы с кодом. Начнем с того, что KeyError был поднят, потому что вы никогда не назначали значения для элементов в словаре. (Я подозреваю, что это было потому, что на самом деле не было никаких значений, чтобы соответствовать клавишам, но вы использовали словарь, потому что в словаре не может быть ключей повторения.) Вторая проблема заключалась в отступе вашего оператора if... else. Моим окончательным изменением было использование конструкции with... as, чтобы открыть файл, который имеет множество преимуществ (например, закрытие файла, даже если есть исключение). Надеюсь, я правильно истолковал ваш вопрос, и этот ответ вам полезен.

Смежные вопросы