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

  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 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,

    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 865
    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 865
    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 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
    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 865
    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 865
    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]

  8. #8
    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
    Citation Envoyé par Sve@r Voir le message
    Mais de rien. C'est vrai que moi, ce que j'ai expliqué...
    désolée
    je suis partie sur le dernier message posté
    shame on me
    d'autant que ton explication était parfaite

  9. #9
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 865
    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 865
    Billets dans le blog
    1
    Par défaut
    Pas de souci
    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
    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
    Je m'amuse un peu

    Et donc, s'il y a un If comme par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    liste = [54,2,7,13,69]
     
    nbre = int(input("Veuillez saisir un entier : "))
     
    [print("Bravo") if nbre in liste else print("Dommage")]
    je suis obligée de mettre un else. Sinon ça ne fonctionne pas, il me dit 'Invalid Syntax'.

    Alors que sans la compréhension, je ne suis pas obligée, je peux me contenter de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if nbre in liste :
        print("bravo")
    En fait c'est pas si compliqué les compréhensions, et c'est marrant

  11. #11
    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,

    Citation Envoyé par RowanMayfair Voir le message
    Et donc, s'il y a un If comme par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    liste = [54,2,7,13,69]
     
    nbre = int(input("Veuillez saisir un entier : "))
     
    [print("Bravo") if nbre in liste else print("Dommage")]
    Certes mais ce if là est un operateur ternaire qui n'a rien à voir avec l'autre.
    Imaginez écrire:
    Intuitivement, sans le "else" on ne sait pas trop ce qu'il y aura dans la variable "a" si la condition est fausse.
    Ce qui est ennuyeux.
    Et çà n'a rien à voir avec les compréhension de listes car:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    >>> [ x for x in range(10) if x % 2 ]
    [1, 3, 5, 7, 9]
    >>>
    il y a bien un if et pas besoin de else...

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

  12. #12
    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
    OK c'est très clair

  13. #13
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 865
    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 865
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par RowanMayfair Voir le message
    En fait c'est pas si compliqué les compréhensions, et c'est marrant
    Oui, pas si compliqué. Et ça peut même faire plusieurs imbrications => domino=[(x, y) for x in range(7) for y in range(x+1)]

    Toutefois ça a pour but initial de générer une liste de trucs utiles. Si c'est juste une liste de "un seul" print()...
    => print("bravo" if nbre in liste else "dommage")
    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]

  14. #14
    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
    Citation Envoyé par Sve@r Voir le message
    Oui, pas si compliqué. Et ça peut même faire plusieurs imbrications => domino=[(x, y) for x in range(7) for y in range(x+1)]

    Toutefois ça a pour but initial de générer une liste de trucs utiles. Si c'est juste une liste de "un seul" print()...
    => print("bravo" if nbre in liste else "dommage")

    je m'entraîne
    donc là je me suis trouvée une petite série d'exercices très très très simples, et je m'amuse à les faire en utilisant des compréhensions.
    Parce que les compréhensions avec plusieurs imbrications c'est cool, mais c'est quand même plus simple de partir sur des exemples...plus simples. Comme ça je m'habitue au mécanisme.


  15. #15
    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
    Bonjour

    Je voudrai pas gêner, donc je me permets de continuer de poster mes petites questions sur les compréhensions dans ce sujet, même s'il est résolu.

    C'est possible une incrémentation dans une compréhension ?
    par exemple ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    liste = [12,580,740,12]
    i = 0
    for elt in liste :
        if elt > 100 :
            i += 1
    j'ai essayé des trucs, du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    i = [(i+1) for elt in liste if elt > 100]
    mais ça fait pas ce que je veux

    peut-être c'est pas possible. (ou pas recommandé d'ailleurs....je me rends compte que les compréhensions de listes, c'est bien quand c'est simple, quand il y a trop de choses dedans ça devient juste illisible)

  16. #16
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 865
    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 865
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par RowanMayfair Voir le message
    C'est possible une incrémentation dans une compréhension ?
    par exemple ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    liste = [12,580,740,12]
    i = 0
    for elt in liste :
        if elt > 100 :
            i += 1
    i=sum(x for x in liste if x > 100)
    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]

  17. #17
    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
    Citation Envoyé par Sve@r Voir le message
    i=sum(x for x in liste if x > 100)
    rah ben non, là il me fait la somme des éléments de la liste > 100
    Moi je veux le nombre d'éléments de la liste > 100

    Edit : mais du coup, j'ai trouvé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    i=sum((i+1) for elt in liste if elt > 100]

    Merci Sve@r

  18. #18
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 865
    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 865
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par RowanMayfair Voir le message
    rah ben non, là il me fait la somme des éléments de la liste > 100
    Moi je veux le nombre d'éléments de la liste > 100
    Oui, pardon, inattention. J'ai pensé "ce qu'il veut c'est la somme de ce que ça contient"

    Citation Envoyé par RowanMayfair Voir le message
    Edit : mais du coup, j'ai trouvé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    i=sum((i+1) for elt in liste if elt > 100]
    Bravo
    i=len(tuple(x for x in liste if x > 100))
    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, 21h55
  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, 05h19
  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, 09h23
  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, 21h33
  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, 12h40

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