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

  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 à 22h32.

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 790
    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 790
    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 874
    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 874
    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 874
    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 874
    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]

  7. #7
    Invité
    Invité(e)
    Par défaut
    Je ne comprends pas ce truc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    depl={
    	top : (0, -1),
    	bottom : (0, 1),
    	left : (-1, 0),
    	right : (1, 0),
    }[key]


    J'utilise numpy pour pouvoir gérer plus facilement l'ajout et la suppression de ligne et de colonne.

    J'ai le projet amateur de créer un jeu multijoueur en ligne consistant à résoudre un immense labyrinthe, je veux tester l'esprit de coopération des joueurs plutôt que celui de compétition. Chaque joueur pourra laisser des indications aux autres au sol pour savoir si ce chemin est un cul de sac ou pas.
    Attendez-vous à ce que je vous sollicite un peu beaucoup... Je crois que je ne me rends pas encore bien compte de ce dans quoi je me lance !

    Petit schéma d'explication de ce que je veux faire pour commencer :
    Nom : Sans titre-1.jpg
Affichages : 132
Taille : 80,4 Ko
    • Dans le rectangle bleu le bonhomme peut bouger.

    • Dans le rectangle noir et blanc, c'est ce qui est affiché à l'écran. (current_array)

    • Dans le rectangle gris et blanc, c'est l'array totale (extrait depuis une très grande image (zoom +++) générée grâce à un magnifique code trouvé sur internet).

    Quand le joueur atteint les bords du rectangle bleu, de nouvelles lignes ou colonnes sont chargées depuis l'array totale (toute l'image) et celle qui ne sont plus affichées à l'écran sont supprimées de la current_array. Histoire d'alléger l'utilisation de la RAM, car en réalité chaque "cellule" est composée de 10*10 "cellules identiques", c'est sur ces subdivisions que se déplace le joueur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    >>> array[0][1] = np.kron(1, np.ones((10,10), dtype=int))
    >>> array[0][1]
    array([[1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
           [1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
           [1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
           [1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
           [1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
           [1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
           [1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
           [1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
           [1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
           [1, 1, 1, 1, 1, 1, 1, 1, 1, 1]])

    L'utilisation du rectangle bleu devrait me permettre d'avoir un affichage un peu plus dynamique, contrairement par exemple au jeu zelda 2D où le joueur reste au milieu de l'écran, je voudrais que ça ressemble un peu plus à Ori côté mouvement de caméra.

    Voli, voilou !

  8. #8
    Membre Expert
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 091
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 091
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if key==bottom and array[player.coord[1]+1][player.coord[0]] == 1 : player.coord[1]+=1
    y a rien à tester là. Il faut juste un dictionnaire pour les directions. par exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    direct = {up:(0,-1),bottom:(0,1),left:(-1,0):right:(1,0)}
    dx,dy = direct[key]
    px,py = player.coord
    v = array[py+dy][px+dx]
    player.coord = (px+dx*v,py+dy*v)
    Oups, j'avais pas vu la réponse de Sve@r.

  9. #9
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 874
    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 874
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par LeNarvalo Voir le message
    Je ne comprends pas ce truc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    depl={
    	top : (0, -1),
    	bottom : (0, 1),
    	left : (-1, 0),
    	right : (1, 0),
    }[key]
    Ben ça me semble clair non? Ce sont les opérations à appliquer en X et en Y selon la touche (variable "key" que tu utilises dans ton code) pour déplacer le joueur. Si la touche est "top" alors X se déplacera en X-0 (donc ne changera pas) et Y se déplacera en Y-1 (donc le joueur monte d'un cran car sur un écran l'axe des Y est inversé, le "0" étant tout en haut) !!!

    Citation Envoyé par LeNarvalo Voir le message
    J'utilise numpy pour pouvoir gérer plus facilement l'ajout et la suppression de ligne et de colonne.
    Mouais... Me semble qu'une liste possède les méthodes insert() et remove() qui permettent aussi de gérer facilement ce genre d'opération...

    Citation Envoyé par LeNarvalo Voir le message
    J'ai le projet amateur de créer un jeu multijoueur en ligne consistant à résoudre un immense labyrinthe, je veux tester l'esprit de coopération des joueurs plutôt que celui de compétition. Chaque joueur pourra laisser des indications aux autres au sol pour savoir si ce chemin est un cul de sac ou pas.
    Ca c'est sympa !!!
    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]

  10. #10
    Invité
    Invité(e)
    Par défaut
    @Sve@r
    Citation Envoyé par Sve@r Voir le message
    Ben ça me semble clair non? Ce sont les opérations à appliquer en X et en Y selon la touche (variable "key" que tu utilises dans ton code) pour déplacer le joueur. Si la touche est "top" alors X se déplacera en X-0 (donc ne changera pas) et Y se déplacera en Y-1 (donc le joueur monte d'un cran car sur un écran l'axe des Y est inversé, le "0" étant tout en haut) !!!
    J'avais jamais vu un dictionnaire sous cette forme, en faite.


    Citation Envoyé par Sve@r Voir le message
    Mouais... Me semble qu'une liste possède les méthodes insert() et remove() qui permettent aussi de gérer facilement ce genre d'opération...
    Peut-être que je reviendrais sur l'utilisation de numpy plus tard si je trouve que ça ralenti trop le script, ça me paraissait bien pratique, en une ligne de code tu peux rajouter une column à gauche ou à droite ou une row en haut ou en bas, je n'ai pas eu besoin de réfléchir à comment coder ça, pareil pour la suppression. Mais oui tu as raison j'aurai pu créer une fonction pour ça avec des tuples ou des listes, à vrai dire j'avais (encore) oublié que list.insert() existait .

    J'utilise aussi np.kron et np.ones comme tu as pu le noter, encore une solution de facilité... mais peut-être pas de rapidité ?


    @josmiley

    Tout bêtement, je n'y avais pas pensé ! Je vais adopter cette méthode, car je pense que les 3/4 du temps les joueurs ne vont pas rentrer dans les murs mais suivre le chemin, donc l'évitement d'un assignement inutile avec la condition devrait être superflu ?

    Et pour savoir, il faut préférer quoi d'un point de vu "beauté", "performance", ... l'assignement systématique d'une nouvelle valeur ou passer par une condition dans ce contexte précis ?
    Oups, j'avais pas vu la réponse de Sve@r.
    Ce que tu proposes est différent ! Je te mets +2 pour la révélation que tu m'as procuré ! Jésus es-tu là !? (Dsl )

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 17/11/2015, 05h56
  2. Réponses: 8
    Dernier message: 18/01/2008, 16h58
  3. Itération/recherche, meilleure façon de faire?
    Par Sallie dans le forum Langage
    Réponses: 34
    Dernier message: 16/01/2008, 11h00
  4. Réponses: 1
    Dernier message: 08/08/2007, 09h45
  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, 13h41

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