J'ai pour tâche de créer une procédure qui prend dans une liste de chaînes et renvoie un dictionnaire qui mappe chaque mot sur toutes les chaînes d'entrée à l'ensemble constitué des numéros de chaîne de toutes les chaînes dans lesquelles ce mot apparaît. Dans le problème réel, les chaînes sont des paragraphes de texte avec le premier index étant 1.
Voici un exemple d'entrée-> sortie:
L = ['abcd e', 'abbc c', 'def f']
makeInverseIndex (L) -> {'a': [1, 2], 'b': [1, 2], 'c': [1, 2], ' d ': [1, 3],' e ': [1, 3],' f ': [3]}
J'ai deux solutions de travail:
def makeInverseIndex3(strlist): return {x:[i for i, w in enumerate(strlist) if x in strlist[i]] for x in w.split()}
3 Réponses :
{"a": [1, 2], "b": [1, 2], "c": [1, 2], "d": [1, 3], "e": [1, 3], "f": [3]}
Cela a fonctionné pour moi:
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]}
Résultat:
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)
Bien, cette fonction est plus soignée que mon makeInverseIndex, mais j'ai accepté une autre réponse car elle utilise une compréhension de dict comme demandé.
Utilisation de la compréhension du dictionnaire avec enumerate
{'a': [1, 2], 'b': [1, 2], 'c': [1, 2], 'd': [1, 3], 'e': [1, 3], 'f': [3]}
Ou nous pouvons utiliser enumerate avec start = 1 plutôt que 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()}
Merci c'est parfait, c'était similaire à ma compréhension de dict en utilisant range après tout! Je ne pouvais tout simplement pas le voir.