Python 不起作用:按第一个字母索引口述文件中的单词

Python 不起作用:按第一个字母索引口述文件中的单词,python,dictionary,Python,Dictionary,我必须基于一个每行有一个小写单词的打开文件编写一个函数。我必须返回一个带有单小写字母键的字典,每个值都是以该字母开头的文件中的单词列表。(字典中的键仅来自文件中出现的单词的字母。) 这是我的代码: def words(file): line = file.readline() dict = {} list = [] while (line != ""): list = line[:].split() if l

我必须基于一个每行有一个小写单词的打开文件编写一个函数。我必须返回一个带有单小写字母键的字典,每个值都是以该字母开头的文件中的单词列表。(字典中的键仅来自文件中出现的单词的字母。)

这是我的代码:

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']}, ...

尝试此解决方案,它考虑了多行中有以相同字符开头的单词的情况,并且不使用
defaultdict
。我还稍微简化了函数:

def words(file):
    dict = {}
    for line in file:
        lst = line.split()
        dict.setdefault(line[0], []).extend(lst)
    return dict

尝试此解决方案,它考虑了多行中有以相同字符开头的单词的情况,并且不使用
defaultdict
。我还稍微简化了函数:

def words(file):
    dict = {}
    for line in file:
        lst = line.split()
        dict.setdefault(line[0], []).extend(lst)
    return dict

您没有为每一封额外的信添加到列表中。尝试:

if line[0] not in dict.keys():
    dict[line[0]] = list
else:
    dict[line[0]] += list

您没有为每一封额外的信添加到列表中。尝试:

if line[0] not in dict.keys():
    dict[line[0]] = list
else:
    dict[line[0]] += list

具体问题是
dict[line[0]]=list
替换新键的值。有很多方法可以解决这个问题。。。我很乐意提供一个,但你问出了什么问题,就这样。欢迎使用StackOverflow。

具体问题是
dict[line[0]]=list
替换新键的值。有很多方法可以解决这个问题。。。我很乐意提供一个,但你问出了什么问题,就这样。欢迎使用StackOverflow。

似乎每个字典条目都应该是一个列表。使用字典键上的方法。

似乎每个字典条目都应该是一个列表。使用字典键上的方法。

尝试此功能

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
试试这个功能

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
为了优雅而牺牲性能(在一定程度上):

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)
}
为了优雅而牺牲性能(在一定程度上):

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)
}

像这样的东西应该有用

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
第一次发现一个新字母时,将出现一个键错误,该字母的后续出现将导致该单词附加到现有列表中

另一种方法是用所需的键预填充dict

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]
不起作用

类似的东西应该起作用

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
第一次发现一个新字母时,将出现一个键错误,该字母的后续出现将导致该单词附加到现有列表中

另一种方法是用所需的键预填充dict

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]
不起作用

关于Pythonic编程风格的一些技巧:迭代文件的每一行,当line:line=file时,不要使用
。readline
只需对file:中的行使用
。您需要代码还是帮助?命名变量
列表
dict
是个坏主意;您无法访问内置列表和字典类。这是家庭作业问题吗?当你告诉奥斯卡“我们不应该使用“defaultdict”或“collections”时,你似乎在暗示这一点。在Python风格中,永远不要调用变量
dict
list
;这些都是内置的:您这样做是为了让
list()
这样的代码不再工作。给出有意义的名称,而不是表示类型的名称。关于Pythonic编程风格的一些提示:迭代文件的每一行,而不是当line:line=file时。readline
只需对文件中的行使用
。您想要代码还是仅仅需要帮助?命名变量
list
dict
是个坏主意;您无法访问内置列表和字典类。这是家庭作业问题吗?当你告诉奥斯卡“我们不应该使用“defaultdict”或“collections”时,你似乎在暗示这一点。在Python风格中,永远不要调用变量
dict
list
;这些都是内置的:您这样做是为了让
list()
这样的代码不再工作。给他们一些有意义的名称,而不是表示类型的名称。如果dict.keys()中没有第[0]行:dict[0]行=列出这意味着什么?如果字母不在字典键中,那么它应该被分配到列表中吗?我会做
行[0]不在dict中
,而不是
行[0]不在dict.keys()
;它更高效、更短。使用
dict.extend
而不是
+=
@younsow可能会更清晰。我刚刚复制了您已经使用的语法。区别在于我添加了一个
else
条件,该条件向分配给字母的现有列表中添加了更多项(
+=
向左侧变量的现有值添加了一些内容。它是
dict[line[0]]=dict[line[0]]的较短版本+list
。当您添加两个列表时,您将得到一个包含两个列表中的项目的新列表,即:一个联接。@请注意,我没有建议
+=
将不起作用,我说使用
.extend
方法将更清晰(我键入的
dict[0]可能无助于我自己的清晰度).extend
as
dict.extend
,它不存在)。如果dict.keys()中没有第[0]行:dict[0]行=列出这意味着什么?如果字母不在字典键中,那么它应该被分配到列表中?我会做
第[0]行不在dict
中,而不是
第[0]行不在dict.keys()中
;它更高效、更短。使用
dict.extend
而不是
+=
@younsow可能会更清晰。我刚刚复制了您已经使用的语法。T