IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

Meilleure façon de faire un assignement conditionnel d'une liste ?


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Invité
    Invité(e)
    Par défaut Meilleure façon de faire un assignement conditionnel d'une liste ?
    Salut,

    Dans le cadre d'une liste ou d'un tuple s'occupant de coordonnées, y a t il une utilité à vouloir faire de l'assignement conditionnel et comment s'y prendre ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    >>>xy=[0,9] #or (0,9)
    >>> #Basique :
    >>> if xy[1]+1<10:
    	xy[1]+=1 #or xy=xy[0],xy[1]+1
     
    >>> #Moins basique :
    >>> if (y:=xy[1]+1)<10:
    	xy[1]=y #or xy=xy[0],y
    La deuxième solution semble plus lente mais je m'y prends peut-être mal ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    >>> def test1():
    	xy = [0,9]
    	if xy[1]+1<10:
    		xy[1]+=1
     
    >>> def test2():
    	xy = [0,9]
    	if (y:=xy[1]+1)<10:
    		xy[1]=y
     
    def test():
    	import time
    	st = time.time()
    	for i in range(10000000):
    		test1()
    	print('test1',time.time()-st)
    	st = time.time()
    	for i in range(10000000):
    		test2()
    	print('test2',time.time()-st)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    >>> test()
    test1 1.152806282043457
    test2 1.2091920375823975
    >>> test()
    test1 1.1500062942504883
    test2 1.1826136112213135
    >>> test()
    test1 1.1328635215759277
    test2 1.2107679843902588
    >>> test()
    test1 1.135441541671753
    test2 1.1759612560272217
    >>> test()
    test1 1.128035306930542
    test2 1.2089295387268066
    >>> test()
    test1 1.1322541236877441
    test2 1.1997888088226318
    C'était une question loufoque de plus !
    Merci d'avance !
    Dernière modification par Invité ; 10/10/2021 à 21h32.

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 762
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 762
    Par défaut
    Salut,

    Déjà, il faudrait expliquer l'intérêt de y[i] + 1 < 10 comparé à y[i] < 9.

    Après côté intérêt de l'assignation dans une condition, c'est pas compliqué...
    Soit l'évaluation de la condition prend du temps et sera réutilisée plus loin et forçe à l'évaluer "avant" (et à stocker le résultat dans une variable) soit c'est "cosmestique" (sauf peut être dans le cas où on assigne à la variable un résultat partiel).

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Salut,

    Déjà, il faudrait expliquer l'intérêt de y[i] + 1 < 10 comparé à y[i] < 9.

    Après côté intérêt de l'assignation dans une condition, c'est pas compliqué...
    Soit l'évaluation de la condition prend du temps et sera réutilisée plus loin et forçe à l'évaluer "avant" (et à stocker le résultat dans une variable) soit c'est "cosmestique" (sauf peut être dans le cas où on assigne à la variable un résultat partiel).

    - W
    Merci pour ta réponse !

    Hum, du coup j'ai l'impression qu'il n'y a pas d'intérêt dans ce que je veux faire... (C'est à dire m'assurer que mon petit bonhomme n'aille pas dans le mur de mon labyrinthe constitué de millions de "cellules" (tableau 2D))

  4. #4
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 840
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par LeNarvalo Voir le message
    Hum, du coup j'ai l'impression qu'il n'y a pas d'intérêt dans ce que je veux faire...
    Ben... première solution: 2 additions identiques et seconde solution: 2 affectations !!! Il doit quand-même y avoir moyen de faire plus simple...

    Citation Envoyé par LeNarvalo Voir le message
    (C'est à dire m'assurer que mon petit bonhomme n'aille pas dans le mur de mon labyrinthe constitué de millions de "cellules" (tableau 2D))
    La première chose à faire c'est de nous dire comment est encodé ce fameux labyrinthe...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  5. #5
    Invité
    Invité(e)
    Par défaut
    @Sve@r
    Oui tu as surement raison, mais je ne suis pas doué pour trouver la solution la plus logique... (ni pour autre chose en y réfléchissant )

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    >>> liste = [0,0]
    >>> if liste[1]:=5:
     
    SyntaxError: cannot use assignment expressions with subscript
    Sinon oui Wiz, m'a déjà averti pour le <9 !

    Il faudrait déjà voir comment est encodé ce fameux labyrinthe...
    Ben c'est un tableau numpy du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    array([[0, 1, 0, 0, 0],
           [0, 1, 1, 1, 0],
           [0, 0, 0, 1, 0]])
    Les 1 c'est le chemin.
    Donc en gros if key==bottom and array[player.coord[1]+1][player.coord[0]] == 1 : player.coord[1]+=1.
    Je voulais essayer d'optimiser ça, histoire de grapiller des pouièmes de secondes ou au moins rendre la chose plus jolie.

    N.B. : Je commence à comprendre pourquoi certains modules préfèrent l'organisation (y,x) plutôt que (x,y).

  6. #6
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 840
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par LeNarvalo Voir le message
    Ben c'est un tableau numpy
    numpy c'est fait pour faire des calculs sur les tableaux. Si c'est juste du stockage, un tableautuple Python suffit.

    Citation Envoyé par LeNarvalo Voir le message
    Je voulais essayer d'optimiser ça, histoire de grapiller des pouièmes de secondes ou au moins rendre la chose plus jolie.
    Pourquoi? Le truc attend que tu tapes sur une touche avant de calculer le déplacement par rapport à la touche tapée. Tu penses vraiment que ces "pouièmes" grapillés vont changer grand chose par rapport à tout le temps passé à attendre la touche ?
    En revanche je présume que le test "< 9" est destiné à protéger contre le dépassement des limites. Ben si tu rajoutes un "bord" à 0 à ton labyrinthe, lui il devient inutile...

    Citation Envoyé par LeNarvalo Voir le message
    Donc en gros if key==bottom and array[player.coord[1]+1][player.coord[0]] == 1 : player.coord[1]+=1.
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    depl={
    	top : (0, -1),
    	bottom : (0, 1),
    	left : (-1, 0),
    	right : (1, 0),
    }[key]
    (newX, newY)=(player.coord[0] + depl[0], player.coord[1] + depl[1])
    if labyrinthe[newX][newY] == 1: (player.coord[0], player.coord[1])=(newX, newY)
    Voilà. Question vitesse de calcul j'en sais rien mais au-moins ça factorise les 4 directions en un seul code.

    Citation Envoyé par LeNarvalo Voir le message
    Je commence à comprendre pourquoi certains modules préfèrent l'organisation (y,x) plutôt que (x,y).
    Ca suit l'organisation naturelle (verticale puis horizontale). D'abord on cherche la ligne dans la page, puis la lettre dans la ligne. Mais dans ce cas précis ça a peu d'importance.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 17/11/2015, 04h56
  2. Réponses: 8
    Dernier message: 18/01/2008, 15h58
  3. Itération/recherche, meilleure façon de faire?
    Par Sallie dans le forum Langage
    Réponses: 34
    Dernier message: 16/01/2008, 10h00
  4. Réponses: 1
    Dernier message: 08/08/2007, 08h45
  5. Est ce bien la meilleure façon de faire un histogramme ?
    Par rvzip64 dans le forum Algorithmes et structures de données
    Réponses: 2
    Dernier message: 10/05/2005, 12h41

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo