Je pense que j'étais sur le point de comprendre comment imprimer tous les mots possibles en fonction de l'entrée utilisateur de mon dictionnaire défini. il est basé sur l'hypothèse que l'entrée utilisateur est «ART», donc les mots possibles que j'ai dans mon dictionnaire sont ART, RAT, TART et TAR mais seules les combinaisons de trois lettres s'impriment. quelqu'un peut-il me dire où je vais mal? Merci!
Dictionary = ["tar","art","tart","rat"] #creates dictionary of set words
StoredLetters = input('input your word here: ') #allows the user to input any word
list(StoredLetters)
def characters(word):
Dictionary = {}
for i in word:
Dictionary[i] = Dictionary.get(i, 0) + 1
return Dictionary
def all_words(StoredLetters, wordSet):
for word in StoredLetters:
flag = 1
words = characters(word)
for key in words:
if key not in wordSet:
flag = 0
else:
if wordSet.count(key) != words[key]:
flag = 0
if flag == 1:
print(word)
if __name__ == "__main__":
print(all_words(Dictionary, StoredLetters))
3 Réponses :
Sur la base des commentaires de suivi, la règle est que nous devons utiliser tous les caractères du mot cible, mais nous pouvons utiliser chaque caractère autant de fois que nous le souhaitons.
Je configurerais le dictionnaire de recherche " "structure de données sous forme de dict Python qui mappe les caractères uniques triés sous forme de tuples dans chaque mot du dictionnaire à une liste des mots réels qui peuvent être formés à partir de ces caractères.
Ensuite, Je gérerais les recherches comme suit:
set signifie que nous autorisons la répétition et le tri des caractères signifie que nous normalisons toutes les permutations possibles de ces lettres. "artt" et l'empêchera de correspondre à "art" . Code:
art => ['tar', 'art', 'tart', 'rat'] artt => ['tart'] ar => [] arttt => [] aret => []
Output:
from collections import defaultdict
class Dictionary:
def __init__(self, words):
self.dictionary = defaultdict(list)
for word in words:
self.dictionary[tuple(sorted(set(word)))].append(word)
def search(self, target):
candidates = self.dictionary[tuple(sorted(set(target)))]
return [x for x in candidates if len(x) >= len(target)]
if __name__ == "__main__":
dictionary = Dictionary(["tar", "art", "tart", "rat"])
tests = ["art", "artt", "ar", "arttt", "aret"]
for test in tests:
print(f"{test}\t=> {dictionary.search(test)}")
Les problèmes dans le code d'origine ont été résolus bien dans les autres réponses. La logique ne semble pas claire car elle compare des caractères à des mots et les noms de variables ne correspondent souvent pas à la logique représentée par le code.
Vous pouvez utiliser un compteur de fréquence, mais vous serez coincé dans le dictionnaire et vous devrez vérifier que chaque compte de caractère dans un mot du dictionnaire est supérieur au compte correspondant dans le mot cible. Je doute que le code que j'offre soit optimal, mais il devrait être beaucoup plus rapide que l'approche du compteur, je pense.
Il semble que certaines choses pourraient y contribuer.
Vous permutez les paramètres sur tous les mots def allwords (Dictionary, StoredLetters): lorsque vous l'appelez dans les principaux allwords (StoredLetters, Dictionary) . Sans spécifier le nom (recherchez les paramètres nommés en python), vous échangeriez l'entrée.
Dans la fonction caractères , il semblerait que vous réinitialisez la variable du dictionnaire. Essayez d'utiliser des noms uniques lors de la création de nouvelles variables. Cela provoque le vidage du dictionnaire de mots que vous avez défini en haut lorsque caractères (mot) est appelé
Merci! J'ai mis à jour pour que mes variables soient plus uniques, je peux voir pourquoi cela serait important maintenant et comment cela le rend alambiqué. Excellentes suggestions!
Tout d'abord, vous confondez les choses en faisant en sorte que le nom de votre variable StoredLetters soit également le nom de l'un des arguments de votre fonction all_words .
Deuxièmement, vous passez en fait StoredLetters , qui est art , comme deuxième argument de la fonction, donc c'est wordSet dans la fonction, pas StoredLetters !
Vous devriez vraiment garder les choses plus claires en utilisant différents noms de variables et en indiquant clairement ce que vous utilisez pour quel argument. Les mots ne sont pas vraiment des mots, c'est un dictionnaire avec des lettres comme clés, et combien de fois ils apparaissent comme valeurs! Rendre le code clair et compréhensible contribue grandement à faciliter le débogage. Vous avez mot , StoredLetters , wordSet , un autre argument StoredLetters , mots = caractères (mot) < / code> qui ne fait pas ce qui est attendu. Tout cela pourrait nécessiter un bon nettoyage.
Quant à la fonctionnalité, avec art , chaque lettre n'apparaît qu'une seule fois, donc pour tarte , qui a t deux fois, if wordSet.count (key)! = words [key] sera évalué comme True, et l'indicateur sera mis à 0, et le mot ne sera pas imprimé.
J'espère que cela aide et bon codage!
Merci beaucoup pour l'explication, pour le nettoyage, je suppose que je suis un peu perdu sur la façon dont je le rendrais plus soigné en plus de résoudre le problème avec StoredLetters (fait et modifié). J'aime vraiment et apprécie l'explication que vous m'avez donnée pour la fonctionnalité, j'ai changé! = En> et cela semble avoir fonctionné mais je ne suis pas sûr que ce changement fonctionne vraiment parce que quand je tape 'arte' pour l'entrée, j'attends le sortie de None mais il me donne en fait les quatre mots de mon dictionnaire dans la sortie. de toute façon, merci beaucoup car cela m'a aidé à avancer dans la bonne direction.
Je pense que vous avez besoin d'une déclaration claire de ce que vous voulez que la fonctionnalité soit. Est-ce pour trouver tous les mots qui peuvent être créés avec vos lettres d'entrée? Pouvez-vous utiliser une lettre plus d'une fois? Êtes-vous autorisé à avoir des lettres supplémentaires? Donc, comme vous l'avez écrit dans votre commentaire, si vous tapez arte vous voulez que cela renvoie None , mais pour art vous voulez rat ET tarte ? Ainsi, les lettres peuvent être utilisées plus d'une fois, mais il ne peut pas y avoir de lettres supplémentaires qui ne sont pas utilisées? Cela fait une grande différence et vous aidera à vous orienter vers une solution.
Au fait, si vous avez aimé ma réponse, veuillez voter pour et sélectionner aussi correct que vous le souhaitez! Merci!
Quel est le résultat attendu pour les entrées suivantes:
"artt","arte","arttt"étant donné le dictionnaire ci-dessus?pour artt juste tarte pour arte juste aucun car il n'y a pas de mot avec e dans le dictionnaire pour arttt aucun aussi car aucun mot n'a 3 t
OK, donc en d'autres termes, vous pouvez utiliser une lettre plus d'une fois, mais vous ne pouvez pas ignorer les lettres. Merci, cela aide à clarifier.
C'est correct! Merci!