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 :

Générer liste dans une liste aléatoire [Python 3.X]


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de RowanMayfair
    Femme Profil pro
    Développeuse Freelance
    Inscrit en
    Mars 2019
    Messages
    247
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 48
    Localisation : France, Haute Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeuse Freelance

    Informations forums :
    Inscription : Mars 2019
    Messages : 247
    Par défaut Générer liste dans une liste aléatoire
    Bonjour,

    Je suis coincée sur un "petit" truc, ça fait 1h30 que je torture Python pour qu'il me génère des listes aléatoires, dans une liste. Sans succès. Il trouve toujours quelque chose à redire pour ne pas le faire, ou alors il me génère 15 listes identiques.

    Bref, passons au petit code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    cara = ['O','.',' ']
     
    new = [[0]*15]*15
     
    i = 0
     
    for ligne in new :
        for elt in ligne :
            e = randrange(3)
            ligne[i] = cara[e]
        i += 1
    c'est le moins pire que j'ai réussi à obtenir. Mais ça ne m'intéresse pas, là j'ai 15 fois la même. Il me "fait" du randrange 1 fois, et répète le même à chaque itération. Alors que j'espérai un "nouveau" randrange à chaque itération.
    Oulà...je ne sais pas si je m'explique bien

    qu'est-ce que je ne fais pas correctement ? Comment obtenir qu'il me "calcule" une nouvelle liste aléatoire à chaque itération ?

    D'avance merci

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

    Citation Envoyé par RowanMayfair Voir le message
    qu'est-ce que je ne fais pas correctement ?
    Probablement:
    qui devrait être:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    new = [ [0,]*15 for _ in range(15)]
    i.e. créer 15 listes différentes plutôt que 15 références à la même liste.

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

  3. #3
    Membre éclairé Avatar de RowanMayfair
    Femme Profil pro
    Développeuse Freelance
    Inscrit en
    Mars 2019
    Messages
    247
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 48
    Localisation : France, Haute Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeuse Freelance

    Informations forums :
    Inscription : Mars 2019
    Messages : 247
    Par défaut
    Bon ben.......ça, ça marche :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    new = []
    i = 0
    while i <= 14 : 
        new += [[choice(cara) for _ in range(15)]]
        i += 1


    je ne sais pas utiliser les compréhensions de listes (je sais que ça existe du moins ), enfin pas encore.
    Bref, du coup j'ai réussi à sortir un truc qui fonctionne

    Merci

  4. #4
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    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 835
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par RowanMayfair Voir le message
    Bon ben.......ça, ça marche :
    Moui. Tu peux toutefois remplacer ton initialisation, while, incrément par un plus simple for i in range(15)...

    Citation Envoyé par RowanMayfair Voir le message
    je ne sais pas utiliser les compréhensions de listes (je sais que ça existe du moins ), enfin pas encore.
    Ben pourtant c'est exactement ce que tu fais quand tu écris [choice(cara) for _ in range(15)]. C'est une liste décrite par un concept et non pas une liste décrite par un exemple (ce qui, là, se traduira alors par [1, 2, 3]).

    Une liste en intension (appelé ausi "comprehension") est une liste qui se construit par une description de son contenu. Exemple "les nombres pairs entre 0 et 10" se décrira "liste des nombres pris sur la suite des 10 premiers naturels et qui respectent la condition divise par 2" et deviendra en Python [x for x in range(10) if (x % 2) == 0].
    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
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 743
    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 743
    Par défaut
    Citation Envoyé par RowanMayfair Voir le message
    je ne sais pas utiliser les compréhensions de listes (je sais que ça existe du moins ), enfin pas encore.
    Pourquoi écrire un truc aussi bancale que:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    new = []
    i = 0
    while i <= 14 : 
        new += [[choice(cara) for _ in range(15)]]
        i += 1
    où vous mélangez compréhension de listes avec des appends, des boucles "while" avec des boucles "for"...

    Pour fabriquer un tableau 15x15, il faut 2 indices et donc 2 boucles "for":
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    new = []
    for _ in range(15):
         line = []
         for _ in range(15):
              line.append(choice(cara))
         new.append(line)
    et visuellement, vous voyez bien que la structure:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
         Z = []
         for _ in range(15):
              Z.append(f())
    se répète...
    C'est un "pattern" très simple que vous allez pouvoir reformuler:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    def create_line(count):
          line = []
          for _ in range(count):
               line.append(choice(cara))
          return line
    Sans changer la structure de l'appelant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    new = []
    for _ in range(15):
         line = create_line(15)
         new.append(line)
    On peut même ré-écrire la fonction en compréhension:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    def create_line(count):
          return [ choice(cara) for _ in range(count) ]
    Si on fait la même chose côté appelant, on obtient:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    new = [  create_line(15) for _ in range(15) ]
    Et comme create_line se résume à une seule ligne, on peut le remplacer par:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    new = [[ choice(cara) for _ in range(15) ] for _ in range(15) ]
    La structure de la double boucle est toujours là, seule la forme change devenant plus compacte.

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

  6. #6
    Membre éclairé Avatar de RowanMayfair
    Femme Profil pro
    Développeuse Freelance
    Inscrit en
    Mars 2019
    Messages
    247
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 48
    Localisation : France, Haute Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeuse Freelance

    Informations forums :
    Inscription : Mars 2019
    Messages : 247
    Par défaut
    donc si on prend par ex :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    e = ['e','a','i','o','u']
    ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    nn = []
    for _ in range(15) :
        nn.append(choice(e))
    fait la même chose que :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    nn = [ choice(e) for _ in range(15) ]
    Cool
    Je crois comprendre le truc, maintenant il va falloir que je trouve à m'entraîner pour bien m'en imprégner, m'en souvenir, et avoir ensuite l'idée de l'utiliser dans mes programmes

    Merci beaucoup Wiztricks

  7. #7
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    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 835
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par RowanMayfair Voir le message
    Merci beaucoup Wiztricks
    Mais de rien. C'est vrai que moi, ce que j'ai expliqué...
    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. [MySQL] Insertion dans une base aléatoire
    Par buggup dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 04/02/2014, 20h55
  2. [XL-2007] Faire une recherche dans une chaine aléatoire
    Par BOMAERO dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 31/01/2014, 04h19
  3. Mettre de la couleur dans une cellule aléatoire
    Par malshix33 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 13/10/2013, 08h23
  4. [XL-2007] USF : Intégrer des données textbox dans une ligne aléatoire
    Par Mo_31 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 22/10/2012, 20h33
  5. Utilisation de "Kill" dans une adresse aléatoire
    Par vlksoft dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 19/01/2009, 11h40

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