2014-11-01 25 views
0

我正在研究一段簡單的代碼,它需要一個文本文件,並將字典中的鍵分配爲英文字母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 

回答

1

你只是想從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))) 
1

肯定有一個更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

0

考慮使用這個詞,而不是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