2012-03-28 16 views
2

我必须根据每行有一个小写字母的打开文件编写函数。我必须返回带有单个小写字母键的字典,每个值都是以该字母开头的文件中的单词列表。 (在字典中的键是从出现在文件中的话只有字母。)不工作:用字母索引字典中的字符

这是我的代码:

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

数Pythonic编程风格的提示:遍历一个文件的每一行,而不是'while line: line = file.readline'只需使用'for line in file:'。 – eddieantonio 2012-03-28 01:14:34

+0

你想要代码或只是帮助吗? – jamylak 2012-03-28 01:14:40

+3

命名变量'list'和'dict'是一个坏主意;您无法访问内置列表和字典类。 – kindall 2012-03-28 01:14:43

回答

3

尝试这种解决方案,它考虑到那里有开始与词的情况下,同一个字符不止一行,并且它不使用defaultdict。我还简化了一下功能:

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

我们不应该使用“defaultdict”或“集合”.. – alicew 2012-03-28 01:15:40

+0

@YounsuW我更新了我的答案,告诉我它是否适合你 – 2012-03-28 01:31:37

+2

你可以使用字典进一步简化方法:'dict.setdefault(line [0],[])。extend(lst)'。 – lvc 2012-03-28 01:38:30

1

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

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

if line [0] not in dict.keys(): dict [line [0]] = list 这是什么意思?如果字母如果不在字典键中,那它应该被分配到列表中? – alicew 2012-03-28 01:27:08

+0

我会在'line [0]不在dict'中,而不是'line [0]不在dict.keys()'中;它更高效,更短。 – 2012-03-28 01:30:15

+0

它可能会更清晰地使用'dict.extend'而不是'+ ='。 – lvc 2012-03-28 01:40:47

0

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

0

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

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 
+0

line.split()会给你一个列表,你确定要追加吗? – 2012-03-28 02:16:52

+0

糟糕,这是错误的,我解决了这个问题。 – Ankhaa 2012-03-28 04:17:17

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) 
} 
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,随后的这封信将会导致该单词被附加现有的列表

另一种方法是预先填充你需要

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]将无法​​正常工作