不工作:通过第一个字母索引dict中文件中的单词

时间:2012-03-28 01:11:07

标签: python dictionary

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

这是我的代码:

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 个答案:

答案 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]无效