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 :

Creation d'une liste de sous liste


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 24
    Par défaut Creation d'une liste de sous liste
    Bonjour tout le monde,
    Je veux créer une liste de ce type:
    M=[ [1,2,3],[4,5,6]]

    J'ai eu plusieurs idées (mauvaises!!) comme:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    M=[]
    for x in range(2):
    M.append([])
    M[x]=x+1,x+2,x+3
    cela me donne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    [(1, 2, 3), (2, 3, 4)]
    Déjà pourquoi des parenthèses j'aimerais bien savoir??

    Ensuite j'ai eu comme idée:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    >>> for x in range(1,7):
    ...     M.append([x,x+1,x+2])
    ... 
    >>> M
    [[1, 2, 3], [2, 3, 4], [3, 4, 5], [4, 5, 6], [5, 6, 7], [6, 7, 8]]
    >>> M=M[::3]
    >>> M
    [[1, 2, 3], [4, 5, 6]]
    >>>
    Mais comme vous voyez c'est artificiel et pas très convaincant. J'ai cherché d'autre solutions mais toutes aussi veines. La difficulté c'est que je ne comprend pas comment x peu prendre la valeur 4,5,6 apres avoir pris 1,2,3.
    Toute aide serait la bienvenue je vous remercie d'avance

  2. #2
    Membre émérite
    Avatar de Antoine_935
    Profil pro
    Développeur web/mobile
    Inscrit en
    Juillet 2006
    Messages
    883
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur web/mobile

    Informations forums :
    Inscription : Juillet 2006
    Messages : 883
    Par défaut
    Salut

    Voici un petit exemple Ce n'est, bien entendu, pas la seule manière de faire.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    >>> liste = [] # Créer une liste vide
    >>>
    >>> for i in xrange(10):
    ...     liste.append([x for x in range(i * 3, (i + 1) * 3)])
    ...
    >>> liste
    [[0, 1, 2], [3, 4, 5], [6, 7, 8], [9, 10, 11], [12, 13, 14], [15, 16, 17], [18,
    19, 20], [21, 22, 23], [24, 25, 26], [27, 28, 29]]
    Si tu veux commencer à 1 et finir à 30:

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 24
    Par défaut Merci pour cette réponse!!!
    J'ai déjà bien avancé, mais si je veux faire la même chose sans la fonction xrange. Juste avec range. Je pense qu'il faut reprendre l'idée du for à l'intérieur des [] mais avec range tout seul ça ne marche pas pourquoi?

  4. #4
    Expert confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 486
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Et comme ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    print [[i, i+1, i+2] for i in xrange(0,20,3)]
     
    [[0, 1, 2], [3, 4, 5], [6, 7, 8], [9, 10, 11], [12, 13, 14], [15, 16, 17], [18, 19, 20]]
    Sinon, xrange et range font la même chose dans une boucle for, c'est à dire renvoient la valeur suivante à chaque boucle (ce sont des "itérateurs"). La seule différence est que range fabrique une liste complète en début de boucle, ce que ne fait pas xrange.

    Par contre, en dehors d'une boucle for, range() permet de construire directement une liste (print range(0,5) => [0, 1, 2, 3, 4]), ce que ne permet pas xrange().

    Tyrtamos

  5. #5
    Membre expérimenté
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    141
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2008
    Messages : 141
    Par défaut
    Salut !

    Citation Envoyé par alcibiade Voir le message
    J'ai eu plusieurs idées (mauvaises!!) comme:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    M=[]
    for x in range(2):
    M.append([])
    M[x]=x+1,x+2,x+3
    Pas loin d'être bon. Il aurait suffi d'écrire à la place de ta dernière ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    M[x] = [x+1, x+2, x+3]
    ou mieux, à la place des 2 dernières lignes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    M.append([x+1, x+2, x+3])
    Après, tu aurais eu M=[[1, 2, 3], [2, 3, 4]], mais c'est un problème qui se serait résolu en utilisant l'argument step de range (ce que fait Tyrtamos).

    Citation Envoyé par alcibiade Voir le message
    cela me donne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    [(1, 2, 3), (2, 3, 4)]
    Déjà pourquoi des parenthèses j'aimerais bien savoir??
    C'est ce qu'on appelle en Python des tuples.
    Il s'agit d'une liste immutable (qu'on ne peut modifier).
    Python rajoute des parenthèses quand il voit des valeurs séparées par des virgules. Ce petit truc permet des choses bien sympathiques, du genre le retour de plusieurs variables par une fonction. E.g.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    >>> def retourmultiple():
    ...     return 1, 2 # On pourrait écrire aussi return (1, 2) mais Python le fait tout seul.
    ...
    >>> a, b = retourmultiple()
    >>> a
    1
    >>> b
    2
    >>> x = retourmultiple()
    >>> x
    (1, 2)
    Il me semble que l'habitude est prise ici de donner comme référence le tuto de Gérard Swinnen pour toute explication, tuto que tu trouveras dans la page "Tutoriels Python" (le bouton en haut de cette page).

    Citation Envoyé par alcibiade Voir le message
    Ensuite j'ai eu comme idée:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    >>> for x in range(1,7):
    ...     M.append([x,x+1,x+2])
    ... 
    >>> M=M[::3]
    Mais comme vous voyez c'est artificiel et pas très convaincant.
    Effectivement, même si on voit bien que tu as de la ressource.

    La solution de Tyrtamos est, à mon humble avis, la meilleure pour ton problème.

    J'ajouterais que l'utilisation de xrange est préférable, à tel point que Python3 supprime la fonction range et renomme xrange en range.

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

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 066
    Par défaut
    y a ça aussi ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [range(i,i+3) ]for i in range(1,31,3)]

  7. #7
    Membre Expert
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 418
    Par défaut
    Allez, à mon tour:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    def M1(n,N):
        return map(lambda a: range(a,a + n), xrange(1, N*n+1,n))
     
    def M2(n,N):
        return map(lambda a:range(1+n*a,1+n*(a+1)), xrange(N))
     
    def M3(n,N):
        import numpy as np
        F = array(range(1,n+1))
        A = array([n for i in range(n)])
        return [ list(F + i*A) for i in xrange(N)]
     
    for f in (M1,M2,M3):
        print f(2,8),'\n',f(3,4),'\n',f(5,4),'\n'

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    [[1, 2], [3, 4], [5, 6], [7, 8], [9, 10], [11, 12], [13, 14]] 
    [[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12]] 
    [[1, 2, 3, 4, 5], [6, 7, 8, 9, 10], [11, 12, 13, 14, 15], [16, 17, 18, 19, 20]] 
     
    [[1, 2], [3, 4], [5, 6], [7, 8], [9, 10], [11, 12], [13, 14]] 
    [[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12]] 
    [[1, 2, 3, 4, 5], [6, 7, 8, 9, 10], [11, 12, 13, 14, 15], [16, 17, 18, 19, 20]] 
     
    [[1, 2], [3, 4], [5, 6], [7, 8], [9, 10], [11, 12], [13, 14]] 
    [[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12]] 
    [[1, 2, 3, 4, 5], [6, 7, 8, 9, 10], [11, 12, 13, 14, 15], [16, 17, 18, 19, 20]]

  8. #8
    Membre Expert
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 418
    Par défaut
    J'ai cherché une solution de découpe d'une première liste ne contenant que les valeurs:

    par exemple
    n,N = 2,4
    xrange(1,n*N + 1) est [1, 2, 3, 4, 5, 6, 7, 8]
    et j'ai cherché une fonction qui isole les éléments de cette liste par groupes de 2

    Mais en restant dans Python, je n'ai pas trouvé.
    Suis intéressé si quelqu'un sait.




    Dans numpy, cette approche est facile. Et la plus lisible, je trouve.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    from numpy import *
     
    n,N = 3,5
    print [ list(row) for row in (arange(n*N) + 1).reshape(N,n)]
    Résultat

    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]]
    Explications:
    par exemple avec n,N = 3,5

    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
     
    arange(n*N) crée un tableau 
    [0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 ]
     
    arange(n*N) + 1 donne
    [1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ]
     
    (arange(n*N) + 1).reshape(5,3) réorganise en
    [[ 1  2  3]
     [ 4  5  6]
     [ 7  8  9]
     [10 11 12]
     [13 14 15]]
     
    row en est une ligne
    list(row) fait de row une liste (virgules)

  9. #9
    Membre Expert
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    941
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2007
    Messages : 941
    Par défaut
    Citation Envoyé par eyquem Voir le message
    J'ai cherché une solution de découpe d'une première liste ne contenant que les valeurs:

    par exemple
    n,N = 2,4
    xrange(1,n*N + 1) est [1, 2, 3, 4, 5, 6, 7, 8]
    et j'ai cherché une fonction qui isole les éléments de cette liste par groupes de 2

    Mais en restant dans Python, je n'ai pas trouvé.
    Suis intéressé si quelqu'un sait.
    Voilà:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    >>> from itertools import groupby
    >>> l
    [1, 2, 3, 4, 5, 6, 7, 8]
    >>> [list(v) for _,v in groupby(l, lambda x : (x-1)//2)]
    [[1, 2], [3, 4], [5, 6], [7, 8]]

Discussions similaires

  1. Code CSS pour une liste et sous-listes imbriquées
    Par Diawar dans le forum Mise en page CSS
    Réponses: 9
    Dernier message: 04/08/2014, 23h17
  2. Couleur listes et sous-listes
    Par Perceuse-Killer dans le forum Mise en page CSS
    Réponses: 2
    Dernier message: 27/05/2010, 13h59
  3. séparer liste java en une liste des sous liste
    Par maili20 dans le forum Langage
    Réponses: 2
    Dernier message: 21/12/2009, 14h31
  4. Inversion listes et sous-listes
    Par yoshï dans le forum Prolog
    Réponses: 6
    Dernier message: 25/11/2007, 18h42
  5. creation d'une sauvegarde(backup) sous un serveur distant
    Par rezgui_fawzi dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 19/11/2007, 12h31

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