简化 Python 词典理解

Simplifying Python Dictionary Comprehension

我有一个任务,我要创建一个接受字符串列表的过程和 returns 一个字典,该字典将所有输入字符串中的每个单词映射到由所有字符串的字符串编号组成的集合其中出现了那个词。在实际问题中,字符串是第一个索引为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()}

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

这是我最好的尝试,尽管我知道由于分配错误而导致错误 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()}

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

谢谢

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]}

这对我有用:

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]}

通过枚举使用字典理解

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()}

或者我们可以使用 enumerate with 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]}