在字典中指定小写字母作为键?

问题描述:

我正在研究一段简单的代码,它需要一个文本文件,并将字典中的键分配为英文字母az中的每个字母,并且以该字母开头的每个单词都作为一个集合分配给该键。我知道这样做肯定会有更多的“pythonic”方式吗?在字典中指定小写字母作为键?

# P8.11 : This program builds a dictionary of sets from a text file of words. 
# The keys are a letter, and the values are a set of words that start with that 
# letter. 

def main(): 
    wordList = set() 
    inFile = open("words.txt", "r") 
    for line in inFile: 
     line = line.rstrip() 
     line = line.lower() 
     wordList = line.split() 
     print(buildDict(wordList)) 
    print(wordList) 
def buildDict(wordList): 
    wordDict = dict() 
    for word in wordList: 
     if word.startswith("a"): 
      wordDict["a"] = word 
     if word.startswith("b"): 
      wordDict["b"] = word 
     if word.startswith("c"): 
      wordDict["c"] = word 
     if word.startswith("d"): 
      wordDict["d"] = word 
     if word.startswith("e"): 
      wordDict["e"] = word 
     if word.startswith("f"): 
      wordDict["f"] = word 
     if word.startswith("g"): 
      wordDict["g"] = word 
     if word.startswith("h"): 
      wordDict["h"] = word 
     if word.startswith("i"): 
      wordDict["i"] = word 

    return wordDict 

你只是想从word中提取第一个字母,并将其用作关键字。 setdefault确保如果word_dict[word[0]]尚不存在,则将其作为关键字添加。

for word in word_list: 
    word_dict.setdefault(word[0], set()).add(word) 

您还可以使用defaultdict

import collections 

word_dict = collections.defaultdict(set) 
for word in word_list: 
    word_dict[word[0]].add(set0) 

最后,使用itertoolsoperator模块的一衬垫(在以多行分裂为可读性)。 groupby负责按照他们的第一个字母对单词进行分组; itemgetter是写lambda x: x[0]的只是另一种方式)

from itertools import groupby 
from operator import itemgetter 

word_dict = dict((letter, set(words)) 
       for letter, words in groupby(sorted(word_list), 
               key=itemgetter(0))) 

肯定有一个更Python的方式:

from collections import defaultdict 

word_dict = defaultdict(set) 

with open('words.txt') as f: 
    for word in f: 
     word_dict[word[0]].add(word) 

print(word_dict) 
+0

+1对于伟大的重构 - 你可能想要再次警惕零长度的单词。 :) – 2014-11-01 19:35:44

+0

@MariaZverina这是一个好主意,但我认为假设正确的输入可能是正确的,以保持答案的简洁性和与问题的相关性。 – 2014-11-01 19:36:54

考虑使用这个词,而不是startswith的第一个字符。

from collections import defaultdict 
def buildDict(wordList): 
    wordDict=defaulttict(set) 
    for word in wordList: 
      wordDict[word[0]].add(word) 
+0

这是我在我的答案中发布的同样的东西。 – chepner 2014-11-01 15:19:04

+0

我开始回答,因为周围没有任何答案 – Lee 2014-11-01 15:57:11