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
asdict.extend
,它不存在)。如果dict.keys()中没有第[0]行:dict[0]行=列出这意味着什么?如果字母不在字典键中,那么它应该被分配到列表中?我会做第[0]行不在dict
中,而不是第[0]行不在dict.keys()中
;它更高效、更短。使用dict.extend
而不是+=
@younsow可能会更清晰。我刚刚复制了您已经使用的语法。T