Не работает: индексирование слов в файле в диктовке по первой букве - PullRequest
2 голосов
/ 28 марта 2012

Я должен написать функцию, основанную на открытом файле, который содержит одно строчное слово в строке. Я должен вернуть словарь с ключами в одну строчные буквы, и каждое значение представляет собой список слов из файла, который начинается с этой буквы. (Ключи в словаре взяты только из букв слов, которые появляются в файле.)

Это мой код:

def words(file):    
    line = file.readline()
    dict = {}
    list = []        
    while (line != ""):
        list = line[:].split()
        if line[0] not in dict.keys():
            dict[line[0]] = list
        line = file.readline()            
    return dict

Однако, когда я тестировал его сам, моя функция, похоже, не возвращала все значения. Если существует более двух слов, начинающихся с определенной буквы, в качестве значений в выходных данных отображается только первое. Что я делаю не так?

Например, файл должен вернуть:

{'a': ['apple'], 'p': ['peach', 'pear', 'pineapple'],  \
 'b': ['banana', 'blueberry'], 'o': ['orange']}, ...

... но возвращается ...

{'a': ['apple'], 'p': ['pear'],  \
 'b': ['banana'], 'o': ['orange']}, ...

Ответы [ 7 ]

3 голосов
/ 28 марта 2012

Попробуйте это решение, оно учитывает случай, когда есть слова, начинающиеся с одного и того же символа в более чем одной строке, и не использует defaultdict. Я также немного упростил функцию:

def words(file):
    dict = {}
    for line in file:
        lst = line.split()
        dict.setdefault(line[0], []).extend(lst)
    return dict
1 голос
/ 28 марта 2012

Вы не добавляете в список каждое дополнительное письмо.Попробуйте:

if line[0] not in dict.keys():
    dict[line[0]] = list
else:
    dict[line[0]] += list
0 голосов
/ 28 марта 2012

Как-то так должно работать

def words(file):
    dct = {}
    for line in file:
        word = line.strip()
        try:
            dct[word[0]].append(word)
        except KeyError:
            dct[word[0]] = [word]
    return dct

При первом обнаружении новой буквы будет KeyError, последующие вхождения буквы приведут к добавлению слова в существующий список

Другой подход заключается в том, чтобы предварительно заполнить диктовку нужными вам ключами

import string
def words(file):
    dct = dict.fromkeys(string.lowercase, [])
    for line in file:
        word = line.strip()
        dct[word[0]] = dct[word[0]] + [word]
    return dct

Я оставлю это в качестве упражнения, чтобы понять, почему dct[word[0]] += [word] не будет работать

0 голосов
/ 28 марта 2012

Жертва производительности (в определенной степени) для элегантности:

with open(whatever) as f: words = f.read().split()

result = {
    first: [word for word in words if word.startswith(first)]
    for first in set(word[0] for word in words)
}
0 голосов
/ 28 марта 2012

Попробуйте эту функцию

def words(file):
    dict = {}
    line = file.readline()
    while (line != ""):
        my_key = line[0].lower()
        dict.setdefault(my_key, []).extend(line.split() )
        line = file.readline()
    return dict
0 голосов
/ 28 марта 2012

Кажется, что каждая словарная статья должна быть списком. Используйте метод append для ключа словаря.

0 голосов
/ 28 марта 2012

Конкретная проблема заключается в том, что dict[line[0]] = list заменяет значение для нового ключа.Есть много способов исправить это ... Я рад предоставить один, но вы спросили, что случилось, и это все.Добро пожаловать StackOverflow.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...