【问题标题】:Assigning lower case alphabet as keys in a dictionary?将小写字母分配为字典中的键?
【发布时间】:2014-11-01 15:05:41
【问题描述】:

我正在编写一段简单的代码,该代码采用文本文件,并将 dict 中的键分配为英文字母 a-z 中的每个字母,并且以该字母开头的每个单词都分配给键作为放。我知道必须有一种更“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

【问题讨论】:

    标签: python dictionary set python-3.4


    【解决方案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)))
    

    【讨论】:

      【解决方案2】:

      肯定有更 Pythonic 的方式:

      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 进行了很好的重构——尽管你可能想再次保护零长度的单词。 :)
      • @MariaZverina 这是个好主意,但我认为假设正确的输入可能是可以的,以保持答案简洁并与问题相关。
      【解决方案3】:

      考虑使用单词的第一个字符而不是开头。

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

      【讨论】:

      • 这与我在回答中发布的内容相同。
      • 我开始回答,因为周围没有任何答案
      猜你喜欢
      • 1970-01-01
      • 2017-04-10
      • 2012-12-09
      • 2013-02-04
      • 2021-04-08
      • 2015-07-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多