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 :

Débutant python : rotation des éléments d'un tableau


Sujet :

Python

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 41
    Par défaut Débutant python : rotation des éléments d'un tableau
    Bonjour,

    Je souhaite faire une rotation des éléments d'un tableau à 12 éléments.
    Je voudrais que T[0], T[1], ...T[10],T[11] devienne T[1], T[2], ...T[11], T[0].

    Je sais qu'on peut faire une affectation "croisée" comme A, B = B, A ou même "en rotation" comme A, B, C = B, C, A.
    Donc, je pourrais écrire, à la rigueur, mon affectation multiple avec un seul signe égal, parce que mon tableau n'est pas trop grand. Mais peut-on faire cela avec un grand tableau ?

    J'ai quand même pu obtenir ce que je voulais en faisant une boucle comme on peut le faire dans d'autres langages :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    A = T[0]
    for n in range(0,10):
        T[n] = T[n+1]
    T[11] = A
    mais peut-on utiliser plus astucieusement les possibilités de Python pour faire cela ?

  2. #2
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 062
    Par défaut
    Bonjour,

    mais peut-on utiliser plus astucieusement les possibilités de Python pour faire cela ?
    Oui voir l'objet deque et sa méthode rotate.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 41
    Par défaut
    Merci fred pour ta réponse,

    Cependant, je vais en rester à ma solution car le but est de faire cette rotation en micropython, avec l'éditeur Mu, sur un tableau de tuples contenant des 3 composantes r,v,b de 12 LED. Je crains que l'importation dans un microcontroleur du module deque ne soit pas possible... En plus ce sont des exercices destinés à des débutants (élèves de seconde en France, encore bien plus débutants que moi)

    En tout cas, j'ai appris quelque chose aujourd'hui. Merci

  4. #4
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 062
    Par défaut
    Je crains que l'importation dans un microcontroleur du module deque ne soit pas possible

    deque
    est un objet qui se trouve dans les modules standards python, je ne vois pas le soucis de l'importation.

    Pour le reste c'est toi qui voit

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 41
    Par défaut
    OK, je vais essayer avec l'objet deque. Il est sans doute facile d'initialiser un tel objet avec un les éléments d'un tableau.
    Encore merci

  6. #6
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 062
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ma_deque = deque(ma_liste)
    tout simplement !

  7. #7
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    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 741
    Par défaut
    Salut,

    Avec une liste:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    >>> L = list(range(10))
    >>> L
    [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    >>> L.append(L.pop(0))
    >>> L
    [1, 2, 3, 4, 5, 6, 7, 8, 9, 0]
    >>>
    Avec un tuple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    >>> T = tuple(range(10))
    >>> T[1:]+T[:1]
    (1, 2, 3, 4, 5, 6, 7, 8, 9, 0)
    >>>
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 41
    Par défaut
    Bon, j'ai essayé d'utiliser un objet deque dans mon code micropython, mais ça ne marche pas.
    En cherchant dans la documentation détaillée de micropython, j'ai trouvé ceci. Il semble que les objets "deque" ne soient pas (encore) implémentés complètement dans micropython ... En tout cas, l'éditeur Mu que j'utilise me renvoie une erreur "undefined name 'deque' ".

    Par contre la piste proposée par wiztricks me semble intéressante (elle combine l'utilisation de append() et de pop() ) : je vais l'essayer.

    Merci à tous pour vos contributions, même si, pour le moment, elles n'ont pas abouti.

  9. #9
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 062
    Par défaut
    Bon, j'ai essayé d'utiliser un objet deque dans mon code micropython, mais ça ne marche pas.
    En cherchant dans la documentation détaillée de micropython, j'ai trouvé ceci. Il semble que les objets "deque" ne soient pas (encore) implémentés complètement dans micropython ... En tout cas, l'éditeur Mu que j'utilise me renvoie une erreur "undefined name 'deque' ".
    Ah ok, dommage...

    Par contre la piste proposée par wiztricks me semble intéressante (elle combine l'utilisation de append() et de pop() ) : je vais l'essayer.
    Ouais, mais là deuxième est très bien aussi, ça se fait aussi avec les listes.

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 41
    Par défaut
    Après essais de la piste de wiztricks, ça ne marche pas car je viens de réaliser que mon objet "tableau" n'est pas un tableau ni même une liste. On ne peut donc pas lui faire utiliser les méthodes append ou pop.
    L'objet sur lequel je veux faire une rotation circulaire de ses 12 éléments est un objet NeoPixel dont les instances, une fois définies, sont de taille fixe (voila pourquoi on ne peut pas utiliser append ni pop). La documentation parlait de ces objets "comme des listes" mais ce n'en sont pas.
    Pour que vous compreniez mieux ce que je cherche à obtenir, voici une solution qui fonctionne :
    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
    from microbit import *
    import neopixel
    from random import randint
     
    np = neopixel.NeoPixel(pin13, 12)
     
    for n in range(0, 12):          # n varie de 0 à 11 inclus (et non pas 12)
        r = randint(0, 255)         # par contre r est entier entre 0 et 255 inclus
        v = randint(0, 255)
        b = randint(0, 255)
        np[n] = (r, v, b)
    while running_time() < 30000:
        np.show()                   # affichage des 12 LEDs
        sleep(500)                  # pendant 0,5 seconde
        A = np[0]                   # on "sauve" la couleur de np[0] en A
        for n in range(0, 11):      # np[0]= np[1]; np[1]=np[2]; ...
            np[n] = np[n+1]         # ... jusqu'à np[10]=np[11] (n varie de 0 à 10)
        np[11] = A                  # np[11] récupère la couleur de np[0]
    sleep(2000)
    np.clear()
    Mon tableau s'appelle np et j'ai cru qu'on pouvait le manipuler comme une liste.
    Je reste persuadé qu'il existe une solution plus courte mais j'ai peut-être tort.

  11. #11
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 062
    Par défaut
    La deuxième solution de @wiztricks devrait fonctionner, ça semble supporter le slicing.

  12. #12
    Membre averti
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 41
    Par défaut
    En utilisant la commande :
    j'obtiens l'erreur :
    TypeError NeoPixel indices must be integers not slice
    Je crois que je vais m'en tenir à la méthode que j'ai trouvée ... pourtant cette proposition me plaisait bien

  13. #13
    Membre Expert

    Homme Profil pro
    Ingénieur calcul scientifique
    Inscrit en
    Mars 2013
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur calcul scientifique

    Informations forums :
    Inscription : Mars 2013
    Messages : 1 229
    Par défaut
    Et pourquoi ne pas faire comme ça ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    T=list(range(12))
    print(T)
    T[:-1], T[-1] = T[1:], T[0]
    print(T)   ####  [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0]
    EDIT: J'ai pas été assez loin dans la lecture des réponses données. Effectivement, votre objet doit pouvoir supporter le slicing pour procéder ainsi.

Discussions similaires

  1. [débutant] Somme des éléments d'un tableau
    Par Kazuhiko$ dans le forum Caml
    Réponses: 5
    Dernier message: 19/11/2008, 11h29
  2. Ajouter des élément a un tableau
    Par Death83 dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 31/07/2007, 14h23
  3. [Struts] ordre des éléments dans un tableau de propriétés
    Par zais_ethael dans le forum Struts 1
    Réponses: 2
    Dernier message: 09/05/2006, 15h54
  4. Réponses: 4
    Dernier message: 17/04/2006, 20h10
  5. [dom je pense]accéder à des éléments d un tableau sans id
    Par luta dans le forum Général JavaScript
    Réponses: 10
    Dernier message: 07/02/2006, 15h31

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