【问题标题】:Simplifying Python Dictionary Comprehension简化 Python 字典理解
【发布时间】:2020-07-02 08:31:49
【问题描述】:

我有一个任务,我要创建一个过程,该过程接收一个字符串列表并返回一个字典,该字典将所有输入字符串中的每个单词映射到由该单词出现的所有字符串的字符串编号组成的集合。在实际问题中,字符串是第一个索引为 1 的文本段落。

这是一个示例输入->输出:

L = ['a b c d e', 'a b b c c', 'd e f f']

makeInverseIndex(L) -> {'a': [1, 2], 'b': [1, 2], 'c': [1, 2], 'd': [1, 3], 'e': [1, 3], 'f': [3]}

我有两个可行的解决方案:

def makeInverseIndex(strlist): 
    InvInd = {}
    for i, d in enumerate(strlist):
        for w in d.split():
            if w not in InvInd:
                InvInd[w] = [i+1]
            elif w in d and i+1 not in InvInd[w]:
                InvInd[w].append(i+1)
    return InvInd

def makeInverseIndex2(strlist): return {x:[d+1 for d in range(len(strlist)) if x in strlist[d]]
                                            for w in strlist for x in w.split()}

我的问题是是否可以使用枚举以任何方式简化 dict 理解。教科书中的问题暗示我应该使用枚举,尽管我不知道如何实现它。

这是我最好的尝试,虽然我知道这是错误的,因为分配错误 IE。 w 在列表理解中分配给,但在行中不被识别:

 for x in w.split()
def makeInverseIndex3(strlist): return {x:[i for i, w in enumerate(strlist) if x in strlist[i]]
                                             for x in w.split()}

我感觉很接近,我确信解决方案可能很明显,但我就是想不通!

谢谢

【问题讨论】:

    标签: python dictionary simplify dictionary-comprehension


    【解决方案1】:

    通过枚举使用字典理解

    def makeInverseIndex4(strlist):
      return {x:[d+1 for d, v in enumerate(strlist) if x in v] for w in strlist for x in w.split()}
    

    或者我们可以使用 start = 1 而不是 d + 1 的枚举

    def makeInverseIndex4(strlist):
          return {x:[d for d, v in enumerate(strlist, start=1) if x in v] for w in strlist for x in w.split()}
    

    输出

    {'a': [1, 2], 'b': [1, 2], 'c': [1, 2], 'd': [1, 3], 'e': [1, 3], 'f': [3]}
    

    【讨论】:

    • 谢谢你,这很完美,毕竟它类似于我使用范围的 dict 理解!就是看不出来。
    【解决方案2】:
    from collections import defaultdict
    
    L = ["a b c d e", "a b b c c", "d e f f"]
    make_inverse_index = defaultdict(set)
    
    for index, line in enumerate(L):
        for word in line.split():
            make_inverse_index[word].add(index + 1)
    
    make_inverse_index = {key: list(value) for key, value in make_inverse_index.items()}
    
    print(make_inverse_index)
    

    输出:

    {"a": [1, 2], "b": [1, 2], "c": [1, 2], "d": [1, 3], "e": [1, 3], "f": [3]}
    

    【讨论】:

      【解决方案3】:

      这对我有用:

      def makeInverseIndex3(strlist):
          dict_f = {}
          for i, w in enumerate(strlist):
              for x in set(w.split()):
                  dict_f[x] = [i + 1] + dict_f.get(x, [])
          return(dict_f)
      

      输出:

      strlist = ['a b c d e', 'a b b c c', 'd e f f']
      print(makeInverseIndex3(strlist))
      
      {'e': [3, 1], 'a': [2, 1], 'c': [2, 1], 'd': [3, 1], 'b': [2, 1], 'f': [3]}
      

      【讨论】:

      • 很好,该函数比我的 makeInverseIndex 更整洁,但我接受了另一个答案,因为它根据要求使用了 dict 理解。
      猜你喜欢
      • 2020-05-05
      • 1970-01-01
      • 2021-11-04
      • 1970-01-01
      • 2013-01-08
      • 1970-01-01
      • 2022-11-22
      • 1970-01-01
      相关资源
      最近更新 更多