Récupérer une variable prédéfinie comme input

Résolu/Fermé
Ziomix - Modifié le 13 oct. 2020 à 23:08
 Ziomix - 14 oct. 2020 à 23:13
Bonjour,

Je suis nouveau en programmation et surtout en python et j'ai un projet obligatoire à faire.

Je vous explique : J'ai une liste d'objets (ce sont des personnes), chacun avec des caractéristiques, chaque caractéristique est basée sur une échelle de 1 à 5 (pas important pour comprendre le problème) donc j'ai 6 hommes et 6 femmes prédéfinis comme objets, je les compare en fonction de leurs caractéristiques, si leurs caractéristiques sont proches elles seront plus ou moins une correspondance parfaite.

Mon but est donc de saisir les noms des personnes que j'entre par un input et ensuite ma fonction de comparaison les compare. Le problème est que lorsque je compare manuellement en saisissant directement les noms, cela fonctionne mais lorsque j'insère un input, une erreur se produit.

Je vous laisse découvrir le code pour mieux comprendre ce que je dis car je ne sais pas si je suis très compréhensible mais je serais très heureux d'avoir une réponse à ce problème, merci :D

PS:Oui c'est sur le projet des 10 couples parfaits pour ceux qui ont reconnus ^^'

class Candidat: #Subject class (characteristics)
def __init__(self,genre,humour,physique,intelligence,projet):
self.genre=genre
self.humour=humour
self.physique=physique
self.intelligence=intelligence
self.projet=projet


def compare(Test1,Test2): #comparison function

#Match à 100% :

if Test1.humour==Test2.humour and Test1.physique==Test2.physique and Test1.intelligence==Test2.intelligence and Test1.projet==Test2.projet:
print("Match Parfait : 100%")
elif Test1.humour!=Test2.humour and Test1.physique!=Test2.physique and Test1.intelligence!=Test2.intelligence and Test1.projet!=Test2.projet:
print("Mauvais Match")

#Match à 75% :

if Test1.humour!=Test2.humour and Test1.physique==Test2.physique and Test1.intelligence==Test2.intelligence and Test1.projet==Test2.projet:
print("Match Parfait : 75%")
elif Test1.humour!=Test2.humour and Test1.physique!=Test2.physique and Test1.intelligence!=Test2.intelligence and Test1.projet!=Test2.projet:
print("Mauvais Match1")

if Test1.humour==Test2.humour and Test1.physique!=Test2.physique and Test1.intelligence==Test2.intelligence and Test1.projet==Test2.projet:
print("Match Parfait : 75%")
elif Test1.humour!=Test2.humour and Test1.physique!=Test2.physique and Test1.intelligence!=Test2.intelligence and Test1.projet!=Test2.projet:
print("Mauvais Match2")

if Test1.humour==Test2.humour and Test1.physique==Test2.physique and Test1.intelligence!=Test2.intelligence and Test1.projet==Test2.projet:
print("Match Parfait : 75%")
elif Test1.humour!=Test2.humour and Test1.physique!=Test2.physique and Test1.intelligence!=Test2.intelligence and Test1.projet!=Test2.projet:
print("Mauvais Match3")

if Test1.humour==Test2.humour and Test1.physique==Test2.physique and Test1.intelligence==Test2.intelligence and Test1.projet!=Test2.projet:
print("Match Parfait : 75%")
elif Test1.humour!=Test2.humour and Test1.physique!=Test2.physique and Test1.intelligence!=Test2.intelligence and Test1.projet!=Test2.projet:
print("Mauvais Match4")

#Match à 50% :

if Test1.humour!=Test2.humour and Test1.physique!=Test2.physique and Test1.intelligence==Test2.intelligence and Test1.projet==Test2.projet:
print("Match Parfait : 50%")
elif Test1.humour!=Test2.humour and Test1.physique!=Test2.physique and Test1.intelligence!=Test2.intelligence and Test1.projet!=Test2.projet:
print("Mauvais Match01")

if Test1.humour!=Test2.humour and Test1.physique==Test2.physique and Test1.intelligence!=Test2.intelligence and Test1.projet==Test2.projet:
print("Match Parfait : 50%")
elif Test1.humour!=Test2.humour and Test1.physique!=Test2.physique and Test1.intelligence!=Test2.intelligence and Test1.projet!=Test2.projet:
print("Mauvais Match02")

if Test1.humour!=Test2.humour and Test1.physique==Test2.physique and Test1.intelligence==Test2.intelligence and Test1.projet!=Test2.projet:
print("Match Parfait : 50%")
elif Test1.humour!=Test2.humour and Test1.physique!=Test2.physique and Test1.intelligence!=Test2.intelligence and Test1.projet!=Test2.projet:
print("Mauvais Match03")

if Test1.humour==Test2.humour and Test1.physique!=Test2.physique and Test1.intelligence!=Test2.intelligence and Test1.projet==Test2.projet:
print("Match Parfait : 50%")
elif Test1.humour!=Test2.humour and Test1.physique!=Test2.physique and Test1.intelligence!=Test2.intelligence and Test1.projet!=Test2.projet:
print("Mauvais Match04")

if Test1.humour==Test2.humour and Test1.physique!=Test2.physique and Test1.intelligence==Test2.intelligence and Test1.projet!=Test2.projet:
print("Match Parfait : 50%")
elif Test1.humour!=Test2.humour and Test1.physique!=Test2.physique and Test1.intelligence!=Test2.intelligence and Test1.projet!=Test2.projet:
print("Mauvais Match602")

if Test1.humour==Test2.humour and Test1.physique==Test2.physique and Test1.intelligence!=Test2.intelligence and Test1.projet!=Test2.projet:
print("Match Parfait : 50%")
elif Test1.humour!=Test2.humour and Test1.physique!=Test2.physique and Test1.intelligence!=Test2.intelligence and Test1.projet!=Test2.projet:
print("Mauvais Match103")


#Match à 25% :

if Test1.humour!=Test2.humour and Test1.physique!=Test2.physique and Test1.intelligence!=Test2.intelligence and Test1.projet==Test2.projet:
print("Match Parfait : 25%")
elif Test1.humour!=Test2.humour and Test1.physique!=Test2.physique and Test1.intelligence!=Test2.intelligence and Test1.projet!=Test2.projet:
print("Mauvais Match001")

if Test1.humour!=Test2.humour and Test1.physique!=Test2.physique and Test1.intelligence==Test2.intelligence and Test1.projet!=Test2.projet:
print("Match Parfait : 25%")
elif Test1.humour!=Test2.humour and Test1.physique!=Test2.physique and Test1.intelligence!=Test2.intelligence and Test1.projet!=Test2.projet:
print("Mauvais Match002")

if Test1.humour==Test2.humour and Test1.physique!=Test2.physique and Test1.intelligence!=Test2.intelligence and Test1.projet!=Test2.projet:
print("Match Parfait : 25%")
elif Test1.humour!=Test2.humour and Test1.physique!=Test2.physique and Test1.intelligence!=Test2.intelligence and Test1.projet!=Test2.projet:
print("Mauvais Match003")

if Test1.humour!=Test2.humour and Test1.physique==Test2.physique and Test1.intelligence!=Test2.intelligence and Test1.projet!=Test2.projet:
print("Match Parfait : 25%")
elif Test1.humour!=Test2.humour and Test1.physique!=Test2.physique and Test1.intelligence!=Test2.intelligence and Test1.projet!=Test2.projet:
print("Mauvais Match004")

Bryan=Candidat("homme",4,5,3,2)
Adrien=Candidat("homme",4,3,2,3)
Marin=Candidat("homme",5,2,4,3)
Alcaraz=Candidat("homme",4,3,2,1)
Allan=Candidat("homme",4,3,2,1)
SebyDaddy=Candidat("homme",4,3,2,1)
#--------------------------------#
Anissa=Candidat("femme",0,5,2,0)
Melanie=Candidat("femme",5,3,4,3)
Dita=Candidat("femme",4,4,3,2)
LeaMary=Candidat("femme",4,3,2,1)
Maissane=Candidat("femme",4,3,2,1)
Kellyn=Candidat("femme",4,3,2,1)

Candidat=input("Homme : ")#input Man
Candidat=input("Femme : ")#input Woman
compare(Test1,Test2)#comparing

'''If I write 'compare(Bryan,Dita)' for exemple, It's directly the subjects, it's working'''


Configuration: Windows / Chrome 85.0.4183.121
A voir également:

5 réponses

jordane45 Messages postés 38138 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 17 avril 2024 4 649
13 oct. 2020 à 23:22
Bonjour,
Je ne fais pas de python... mais... Truc tout bête.... à tout hasard...
Candidat=input("Homme : ")#input Man
Candidat=input("Femme : ")#input Woman
compare(Test1,Test2)#comparing

Ca ne serait pas plutôt
Test1=input("Homme : ")#input Man
Test2=input("Femme : ")#input Woman
compare(eval(Test1),eval(Test2))#comparing

1
dachiasse Messages postés 1709 Date d'inscription samedi 12 septembre 2020 Statut Membre Dernière intervention 13 mai 2021 148
Modifié le 14 oct. 2020 à 00:13
Salut,
Jordane est peut-être un génie mais je te conseille de taper : danger eval python sur un moteur de recherche.
Exemple : https://stackoverflow.com/questions/1832940/why-is-using-eval-a-bad-practice
je ne suis pas prof, par contre, si je l'étais, je vois un eval sur une copie, je la démonte. En gros, je ne donne même pas la moyenne.
L'utilisation d'instructions dangereuses c'est comme un HS sur une dissertation.
1
quent217 Messages postés 421 Date d'inscription vendredi 25 septembre 2015 Statut Membre Dernière intervention 1 mars 2024 344
14 oct. 2020 à 18:24
Bonjour,
Je suis d'accord avec vous sur le fait que eval est généralement à éviter dans un code python, cependant, je pense qu'il faut relativisé le danger.
Si eval est déconseillé, c'est en premier lieu car elle permet à l'utilisateur d'executer n'importe quel code arbitrairement et cela peut constituer une faille de sécurité. Cependant, ce n'est pas un code qui sera accessible à distance. Pour pouvoir l'executer il faudra être déjà connecté à la machine, et dans ce cas on n'a pas besoin de ce code python pour faire ce que l'on veut.
Et pour ce qui concerne la propreté du code et sa robustesse, je pense que l'on peut faire tout autant de reproche à votre solution (bien qu'elle réponde parfaitement à la question posée). Par exemple si l'utilisateur entre le nom d'un candidat qui n'existe pas, le programme plante. Pour un programme en production, ce n'est pas mieux que le programme de Jordane.

Loin de moi l'idée de vous critiquer, mais je voulais juste indiquer que l'utilisation du eval dans ce contexte, sachant qu'il s'agit d'un exercice, n'est à mon avis pas à rejeté avec autant de femeté :)

Je vous souhaite une très bonne soirée.
0
dachiasse Messages postés 1709 Date d'inscription samedi 12 septembre 2020 Statut Membre Dernière intervention 13 mai 2021 148 > quent217 Messages postés 421 Date d'inscription vendredi 25 septembre 2015 Statut Membre Dernière intervention 1 mars 2024
14 oct. 2020 à 21:50
Dans ce contexte oui. Mais je pense que lors d’un exercice, il faut penser au pire.
0
Ziomix > dachiasse Messages postés 1709 Date d'inscription samedi 12 septembre 2020 Statut Membre Dernière intervention 13 mai 2021
14 oct. 2020 à 23:13
Merci à vous dachiasse en tout cas pour cette superbe aide très instructive et complète, je m'en inspirerais pour mes prochains projets :) C'est super cool qu'il y ai toujours des gens pour répondre à nos questions dans les forums !
Merci, bonne fin de soirée
0
dachiasse Messages postés 1709 Date d'inscription samedi 12 septembre 2020 Statut Membre Dernière intervention 13 mai 2021 148
Modifié le 14 oct. 2020 à 03:00
Voici ma proposition. Aucun eval, un algorithme de comparaison de moins de 20 lignes.
Je n'ai pas géré l'erreur du prénom inexistant dans le dictionnaire.

from itertools import zip_longest

# un dictionnaire avec comme paire clé, valeur : prénom du candidat, son instance
dico_candidat = {}
class Candidat:
    # l'attribut prenom permet l'ajout du candidat dans le dictionnaire
    # l'attribut *caracteristiques est un tuple d'une longueur définie dynamiquement après instanciation
    # cet attribut contient des éléments de type entier (plus facile et plus rapide à calculer pour le processeur)
    def __init__(self, prenom, masculin, *caracteristiques):
        self.prenom = prenom
        self.masculin = masculin
        self.caracteristiques = caracteristiques
        dico_candidat[self.prenom] = self

    def comparer(self, other, toutes=False): # je te laisse te faire plaisir dans l'algo de cette méthode
# mais, force est de constater que la mienne fait une quinzaine de lignes, la tienne en fait à peu près 150
            resultat = 0
            if not toutes: # dans le cas où on ne compare que les n premières caractéristiques inscrites
                for self_carac, other_carac in zip(self.caracteristiques, other.caracteristiques):
                    resultat += abs(self_carac - other_carac)
            else: # dans ce cas, toute caractéristique non inscrite par le candidat prend la valeur de -11 (nombre arbitraire)
                for self_carac, other_carac in zip_longest(self.caracteristiques, other.caracteristiques, fillvalue=-11):
                    resultat += abs(self_carac - other_carac)
            if resultat == 0:
                print("100%")
            if 0 < resultat < 4:
                print("75%")
            if 4 <= resultat < 8:
                print("50%")
            if 8 <= resultat < 17:
                print("25%")
            if resultat >= 17:
                print("0%")        

# J'ai volontairement mis un nombre de caractéristiques différent pour chaque candidat
Bryan = Candidat("Bryan", True, 2,3,3,2,1,3,4,5,5,5)
Adrien = Candidat("Adrien", True, 4,5,5,5,4,0,0,4)
Anissa = Candidat("Anissa", False, 5,3,5,0,0,2)
Melanie = Candidat("Melanie", False, 4,5,5,5,5,4,4,2,0,3,4,4,5)


# si tu compares ces 2 candidats, tu obtiendras 100 %
Alcaraz = Candidat("Alcaraz", True, 4,3,2,1)
LeaMary = Candidat("LeaMary", False, 4,3,2,1)

print(dico_candidat.keys())

homme = input("Tapez un prénom masculin dans le dictionnaire : ")
femme = input("Tapez un prénom féminin dans le dictionnaire : ")

# Dans tes input, tu ne compares que des personnes de sexe opposé.
if dico_candidat[homme].masculin == dico_candidat[femme].masculin:
    print("Cette version permet de ne comparer que deux personnes de sexes opposés.")
else:
    print("Si vous voulez comparez toutes les caractéristiques\n(certaines personnes ont omis des caractéristiques), répondez oui.")
    print("Toute autre réponse équivaut à un non")
    toutes = input("Toutes les caractéristiques ? (oui ?) : ")
    if toutes.strip().lower() == "oui": # nettoie la donnée reçu, "   OUi   " devient "OUi" après strip() puis "oui" après lower()
        dico_candidat[homme].comparer(dico_candidat[femme], True)
    else:
        dico_candidat[homme].comparer(dico_candidat[femme])
1
Comment dire, tu ne fais peut-être pas de python(ce qui m'étonne) mais t'es un putain de génie mec, ça marche merciiiiiiiii, c'était vraiment tout simple en plus (enfin pour toi). J'ai également trouvé une solution sur un forum anglophone mais qui pour le coup était plus compliqué à comprendre et plus longue :)
Merci encore !!
0
jordane45 Messages postés 38138 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 17 avril 2024 4 649
13 oct. 2020 à 23:51
Je fais d'autres langage de programmation.... Ça aide.
Ce n'est qu'une question de logique. Il n'est pas si compliqué de passer d'un langage à un autre.
Bonne soirée.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Merci beaucoup, ça marche également c'est une autre méthode qui marche très bien et qui est très complète, Merci Dachiasse
0