python 不工作:按首字母索引法令文件中的单词

gcuhipw9  于 2023-03-28  发布在  Python
关注(0)|答案(7)|浏览(125)

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

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

disho6za1#

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

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

ffx8fchx2#

您不会为每个额外的字母添加到列表中。请尝试:

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

g52tjvyc3#

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

ubof19bj

ubof19bj4#

牺牲性能(在一定程度上)来换取优雅:

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

kxxlusnw5#

像这样的东西应该管用

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

ss2ws0br

ss2ws0br6#

试试这个功能

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
zzwlnbp8

zzwlnbp87#

具体问题是dict[line[0]] = list替换了新键的值。

相关问题