【问题标题】:Struggling with dictionaries与字典斗争
【发布时间】:2019-12-01 13:00:42
【问题描述】:

如果有人可以帮助我解决以下练习,我将不胜感激。

编写一个函数,该函数接受一个包含由空格分隔的单词的字符串并创建一个字典,其中键对应于字符串中单词的最后一个字符,而关联的值对应于以该字符结尾的单词的列表。

此外,列表必须按字典顺序排序

例子

string = "This will be an amazing experience"

应该返回以下字典

{'s':['This'], 'l':['will'], 'e':['be', 'experience'], 'n':['an'], 'g':['amazing']}

我知道应该如何解决这个练习。但是,鉴于我仍然是 Python 的初学者,我很挣扎。

我做的第一件事是创建一个空字典。其次,我使用 split 方法将单词字符串转换为列表。之后,我创建了另一个列表,它将第一个字符串列表中单词的最后一个字符放入新列表中。

我使用 dict 将第二个列表的元素作为键放入我的字典中,效果很好。问题是我不能把对应的单词列表作为值。

这是我的代码:

def dictionary (string):

    mydict = {}
    mylist = string.split()
    mylist2 = []

    for word in mylist:

        mylist2.append(word[-1])
        mydict = dict((el,(word[-1] for word[-1] in mylist)) for el in mylist2)

    return mydict

【问题讨论】:

    标签: python dictionary


    【解决方案1】:

    你不需要两个列表,算法很简单:

    1. 初始化一个空字典
    2. 把句子分成单词
    3. 遍历单词
    4. 获取单词的最后一个字符,这是字典的关键
    5. 检查该键是否已存在于字典中,如果不存在,则使用空列表对其进行初始化
    6. 将单词附加到所述列表中
    result = {}
    
    for word in string.split():
        key = word[-1]
    
        if key not in result:
            result[key] = []
    
        result[key].append(word)
    

    使用dict.setdefaultdefaultdict 可以缩短它,但这是基本思想。

    【讨论】:

      【解决方案2】:

      您可以使用collections.defaultdict 创建一个带有默认值的空列表的字典。然后在遍历单词列表时,您可以提取最后一个字符作为键并将单词添加到该键的值列表中

      import collections
      
      def dictionary(string):
      
          #Dictionary with default value as empty list
          mydict = collections.defaultdict(list)
      
          #Iterate over list of words
          for word in string.split():
      
              #Take last character and add word to the value list for that character
              last_char = word[-1]
              mydict[last_char].append(word)
      
          return dict(mydict)
      
      print(dictionary("This will be an amazing experience"))
      

      输出将是

      {'s': ['This'], 'l': ['will'], 'e': ['be', 'experience'], 'n': ['an'], 'g': ['amazing']}
      

      【讨论】:

        【解决方案3】:

        对于字典排序部分,您需要记住对列表进行排序 生成它们后:

        my_string = "This will be an amazing experience"
        
        def make_dict(string):
            my_dict = {}
            for word in string.split():
                my_dict.setdefault(word[-1], []).append(word)
            for l in my_dict.values():
                l.sort()
            return my_dict
        
        print(make_dict(my_string))
        

        另一种可能性是构建堆而不是列表,然后快速 从这些堆中生成排序列表。根据您的具体用例,您的 里程可能会有所不同。

        【讨论】:

        • 这对我很有帮助。有没有什么书或网站你会推荐阅读来学习所有这些东西?非常感谢
        • 嗨@alex108。你太客气了!我个人只是通过做很多项目和谷歌搜索我必须找到 StackOverflow 答案的问题来学习 Python :)。通常,如果您有其他人以前会问过的问题 - 有时需要进行一些搜索才能得到它,但是随着您的 Python 语言越来越好,这会变得更容易。
        • 我认为阅读完整的官方 python 文档会让我受益匪浅,你觉得呢?你花了多长时间才精通 Python?只是好奇。
        • @alex108,我会说几个月——尽管我认为我永远不会停止学习有关 Python 的新事物(以及一般的编程!)。官方文档是一个很好的资源。如果您发现自己使用re,我绝对建议您阅读页面的说明性部分,例如re 模块的文档,但我不确定一次性阅读所有内容会获得多少 -我个人总是通过找出需要应用的东西来学得更好。
        【解决方案4】:
        st = "This will be an amazing experience"
        def func(st):
            d={}
            for v in st.split(' '):
                if v[-1] in d:
                    d[v[-1]].append(v)
                else:
                    d[v[-1]]=[v]
            return d
        print(func(st))
        

        【讨论】:

        • 您能补充一些文字信息吗?您的代码 sn-p 究竟如何帮助解决问题?
        猜你喜欢
        • 2020-09-18
        • 2018-05-23
        • 2013-11-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-02-21
        • 2021-10-30
        相关资源
        最近更新 更多