在字典中指定小写字母作为键?
问题描述:
我正在研究一段简单的代码,它需要一个文本文件,并将字典中的键分配为英文字母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)
最后,使用itertools
和operator
模块的一衬垫(在以多行分裂为可读性)。 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)
+1对于伟大的重构 - 你可能想要再次警惕零长度的单词。 :) – 2014-11-01 19:35:44
@MariaZverina这是一个好主意,但我认为假设正确的输入可能是正确的,以保持答案的简洁性和与问题的相关性。 – 2014-11-01 19:36:54