Je fais un moteur de recherche, j'ai essayé de coder de sorte que lorsque l'utilisateur saisit certains des mots-clés, il recherche le mot-clé dans le dictionnaire et imprime la clé et les éléments.
Canada = {'name': 'Canada', 'continent': 'North America', 'capital': 'Ottawa', 'currency': 'Canadian dollar', 'population': '32,268,240', 'area': '9,970,610'} Laos = {'name': 'Laos', 'continent': 'Asia', 'capital': 'Vientiane', 'currency': 'Lao kip', 'population': '5,924,145', 'area': '236,800'} Mexico = {'name': 'Mexico', 'continent': 'North America', 'capital': 'Mexico City', 'currency': 'Mexico peso', 'population': '107,029,400', 'area': '1,958,201'} key_words = ("Canada", "Mexico", "Laos") key = ("area", "population", "currency") user_input = input("Type: ") for word in user_input.split(): if word in key_words: print()
Pourriez-vous m'aider avec le codage pour que: Par exemple: Lorsque l'utilisateur saisit: "monnaie du Mexique", il imprimera: peso mexicain, ou lorsque l'utilisateur saisira: "région du Laos", il imprimera 236.800.
3 Réponses :
Vous devez définir certaines règles que l'utilisateur doit suivre, vous pouvez créer un moteur de recherche de requête floue à partir de zéro, mais ce n'est pas quelque chose qui va se passer aujourd'hui. Pour l'instant, faites en sorte que l'utilisateur spécifie ce qu'il veut, par exemple. PAYS DE L'ÉLÉMENT
.
Enter query: population and currency of mexico >> currency Mexico peso >> population 107,029,400
Vous pouvez restructurer votre code comme ceci en utilisant un dictionnaire pour contenir toutes vos données au lieu de le diviser en variables.
database = { 'canada': { 'name': 'Canada', 'continent': 'North America', 'capital': 'Ottawa', 'currency': 'Canadian dollar', 'population': '32,268,240', 'area': '9,970,610' }, 'laos' : { 'name': 'Laos', 'continent': 'Asia', 'capital': 'Vientiane', 'currency': 'Lao kip', 'population': '5,924,145', 'area': '236,800' }, 'mexico': { 'name': 'Mexico', 'continent': 'North America', 'capital': 'Mexico City', 'currency': 'Mexico peso', 'population': '107,029,400', 'area': '1,958,201' } } user_input = input("Enter your query: ") user_input = user_input.lower().split(' ') # find country country = None for keyword in user_input: if keyword in database: # using .pop() removes the country from the list country = user_input.pop(user_input.index(keyword)) # If the user entered a valid country if country: for keyword in user_input: if keyword in database.get(country): print(keyword, database[country][keyword]) else: print('Could not find that country in the database')
EDIT : Code mis à jour pour que vous puissiez être plus ambigu et saisir des mots clés / pays dans n'importe quel ordre et avoir plusieurs mots clés
exemple:
Enter <query> <country>: currency mexico >> Mexico pesos
Merci pour votre réponse. Cela m'a vraiment beaucoup aidé. Mais je me demande simplement, que se passe-t-il si l'utilisateur saisit des mots-clés avec d'autres mots. Existe-t-il un moyen d'améliorer le code pour qu'il puisse s'adapter? Merci d'avance
@ Pentagone J'ai mis à jour le code, vous pouvez donc maintenant entrer des mots-clés dans n'importe quel ordre et entrer plusieurs mots-clés à trouver, par exemple. mexico capital currency
ou même population mexico area
. Si vous voulez créer un moteur de recherche comme google où vous pouvez taper quelle est la population du mexique et de sa région?
alors vous devrez vous pencher sur la correspondance de chaîne floue (google it)
Vous pouvez essayer:
Canada = {'name': 'Canada', 'continent': 'North America', 'capital': 'Ottawa', 'currency': 'Canadian dollar', 'population': '32,268,240', 'area': '9,970,610'} Laos = {'name': 'Laos', 'continent': 'Asia', 'capital': 'Vientiane', 'currency': 'Lao kip', 'population': '5,924,145', 'area': '236,800'} Mexico = {'name': 'Mexico', 'continent': 'North America', 'capital': 'Mexico City', 'currency': 'Mexico peso', 'population': '107,029,400', 'area': '1,958,201'} countries = {'Canada' : Canada, 'Mexico' :Mexico, 'Laos' : Laos} user_input = input("Type: ") asked_country = list(set(user_input.split()).intersection(countries.keys()))[0] output = list(set(countries[asked_country].keys()))[0] print(countries[asked_country][output]) # Type: currency of Mexico # Mexico peso
Solution pas courte, mais plus claire et plus large. Par exemple, pour une requête comme Superficie et population du Canada
, il imprimera:
from collections import defaultdict Canada = {'name': 'Canada', 'continent': 'North America', 'capital': 'Ottawa', 'currency': 'Canadian dollar', 'population': '32,268,240', 'area': '9,970,610'} Laos = {'name': 'Laos', 'continent': 'Asia', 'capital': 'Vientiane', 'currency': 'Lao kip', 'population': '5,924,145', 'area': '236,800'} Mexico = {'name': 'Mexico', 'continent': 'North America', 'capital': 'Mexico City', 'currency': 'Mexico peso', 'population': '107,029,400', 'area': '1,958,201'} key = set(["area", "population", "currency"]) # build the forward and reverse indexes forward_index = [Canada, Laos, Mexico] reverse_index = defaultdict(set) for i, description in enumerate(forward_index): phrase = ' '.join(['%s %s'%(k,v) for k, v in description.items()]) words = phrase.lower().split() for w in words: reverse_index[w].add(i) # search user_input = input("Type: ") res = None keywords = set() for word in user_input.lower().split(): if word in key: keywords.add(word) posting_set = reverse_index.get(word, None) # tolerant search: skip missing words if posting_set is None: continue if res is None: res = posting_set else: res = res.intersection(posting_set) # print all the results if res is None or len(keywords) == 0: print("<nothing found>") else: print("results:") for idx in res: desc = forward_index[idx] for kw in keywords: print("%s = %s" % (kw, desc[kw]))
Type: area and population of Canada results: area = 9,970,610 population = 32,268,240
Et pourquoi pensez-vous que le code publié pourrait y parvenir?
As-tu une question?
Je suis désolé de ne pas avoir publié la question correctement, je l'ai modifiée maintenant.
tout d'abord le texte
split ()
en mots, puis vérifiez chaque mot de chaque dictionnaire. La plupart des mots doivent être comparés aux clés - c'est-à-dire.area
- mais certains avec des valeurs - c'est-à-dire.Mexique
. Ou conservez tous les dictionnaires dans un seul dictionnaire et utilisez le nom comme clé -data = {"Mexico": {'area': '1,958,201'}}