我必须根据一个打开的文件编写一个函数,每行有一个小写字。我必须返回一个包含单个小写字母的字典的字典,每个值都是以该字母开头的文件中的单词列表。 (字典中的键仅来自文件中出现的单词的字母。)
这是我的代码:
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']}, ...
答案 0 :(得分:3)
尝试此解决方案时,会考虑在多行中以相同字符开头的单词并且不使用defaultdict
的情况。我还简化了一下这个功能:
def words(file):
dict = {}
for line in file:
lst = line.split()
dict.setdefault(line[0], []).extend(lst)
return dict
答案 1 :(得分:1)
您不会为每个额外的字母添加列表。尝试:
if line[0] not in dict.keys():
dict[line[0]] = list
else:
dict[line[0]] += list
答案 2 :(得分:0)
具体问题是dict[line[0]] = list
替换了新密钥的值。有很多方法可以解决这个问题...我很乐意提供一个,但你问错了什么,就是这样。欢迎StackOverflow。
答案 3 :(得分:0)
似乎每个字典条目都应该是一个列表。在字典键上使用append方法。
答案 4 :(得分:0)
尝试此功能
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
答案 5 :(得分:0)
牺牲优雅的表现(在一定程度上):
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)
}
答案 6 :(得分:0)
这样的事情应该有效
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,随后出现的字母将导致该字词被附加到现有列表中
另一种方法是用你需要的键预先填充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]
无效