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 :

Construire un simple array 2 dimensions à partir d’une string [Python 3.X]


Sujet :

Python

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    291
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2005
    Messages : 291
    Points : 126
    Points
    126
    Par défaut Construire un simple array 2 dimensions à partir d’une string
    Bonjour,
    Depuis plusieurs jours, j’étudie le python pour élargir mes connaissances, c'est un très beau langage mais je rencontre quelques difficultés.

    Voici mon problème, J’ai une chaine de caractères avec des retour à la ligne (\n).
    Mon objectif est simplement le transformer en array à 2 dimension autrement dit «liste de liste. (matrix[][])«
    Voici ma chaîne de caractères.
    OOOOOOOOOOOOOOOOOOOO\n
    OXO . O O . O\n
    O.O O O O O O\n
    O O O O O O O\n
    O.O O . O O O\n

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    chaine ="OOOOOOOOOOOOOOOOOOOO\nOXO . O    O .     O\nO.O O O    O O     O\nO O O O    O O     O\nO.O O .    O O     O\n"

    Et je souhaite obtenir un array 2 dimensions
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    matrix
    ['OOOOOOOOOOOOOOOOOOOO', 'OXO . O    O .     O', 'O.O O O    O O     O', 'O O O O    O O     O', 'O.O O .    O O     O']
    J'ai tenter un approche simple avec des boucles qui a fonctionné. Comme en C.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    chaine ="OOOOOOOOOOOOOOOOOOOO\nOXO . O    O .     O\nO.O O O    O O     O\nO O O O    O O     O\nO.O O .    O O     O\n"
    matrix = []
    for line in chaine.split("\n"):
    	print(line)
    	matrix.append(line)
    Reusltat

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    >>> matrix
    OOOOOOOOOOOOOOOOOOOO
    OXO . O    O .     O
    O.O O O    O O     O
    O O O O    O O     O
    O.O O .    O O     O
     
    >>> matrix
    ['OOOOOOOOOOOOOOOOOOOO', 'OXO . O    O .     O', 'O.O O O    O O     O', 'O O O O    O O     O', 'O.O O .    O O     O', '']
    Youpi, Ca marche....Mais Oups, ce n'est pas très python

    Et ici que je coince. J'ai tenté d'utiliser ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    matrix = list(map(str, line) for line in chaine.split("\n"))
    Il me renvoie un objet avec un type map malgré la commande "list" pour le convertir.
    Malgré mon mauvais résultat j'ai tenté de le parcourir. mais badadoum. Ca ne fonctionne pas.
    resultat:
    matrix
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [<map object at 0x000001742089CF60>, <map object at 0x00000174208A3048>, <map object at 0x00000174208A30F0>, <map object at 0x00000174208A3198>, <map object at 0x00000174208A3240>, <map object at 0x00000174208A32E8>]
    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
    >>> for i in matrix:
    ...  print(i)
    ...
    <map object at 0x000001742089CBE0>
    <map object at 0x000001742089CD68>
    <map object at 0x000001742089CE10>
    <map object at 0x000001742089CEB8>
    <map object at 0x000001742089CEF0>
    <map object at 0x00000174208A3358>
     
    matrix[0]
    <map object at 0x000001742089CBE0>
     
    matrix[0][0]
     
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    TypeError: 'map' object is not subscriptable
    Ma première question: qu'es ce qui se passe ? Comment faire balader dans se type d’objet et accéder(voir mes valeurs) ?
    Comment faire un array a deux dimension de manière pytfon ?
    Merci de vos conseils.

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 281
    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 281
    Points : 36 768
    Points
    36 768
    Par défaut
    Salut,

    Ben avec .splitlines()
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    >>> data = '1234\n5678\n9012\n'
    >>> data.splitlines()
    ['1234', '5678', '9012']
    >>>
    on a déjà séparé les lignes. Reste à découper chaque chaîne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    >>> list('1234')
    ['1', '2', '3', '4']
    >>>
    Donc:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    >>> matrix = [ list(s) for s in data.splitlines() ]
    >>> matrix
    [['1', '2', '3', '4'], ['5', '6', '7', '8'], ['9', '0', '1', '2']]
    >>> matrix[1][1]
    '6'
    >>> matrix[1][0]
    mais... avec:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    >>> matrix = data.splitlines()
    >>> matrix
    ['1234', '5678', '9012']
    >>> matrix[1][0]
    '5'
    >>>
    J'ai aussi un tableau (liste de chaînes de caractères).
    a vous de voir la subtile différence.

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

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    291
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2005
    Messages : 291
    Points : 126
    Points
    126
    Par défaut
    J'ai l'air bien bête. et pourtant j'ai passé du temps...
    Mais vous pourriez m'en dire plus sur l’objet type map ?

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 281
    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 281
    Points : 36 768
    Points
    36 768
    Par défaut
    Citation Envoyé par zoltix Voir le message
    J'ai l'air bien bête. et pourtant j'ai passé du temps...
    Mais vous pourriez m'en dire plus sur l’objet type map ?
    Il y aurait beaucoup à raconter sur la ligne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    matrix = list(map(str, line) for line in chaine.split("\n"))
    tout d'abord (map(str, line) for line in chaine.split("\n")) qui mine de rien est ce que Python appelle un generator:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    >>> g = (map(str, line) for line in chaine.split("\n"))
    >>> g
    <generator object <genexpr> at 0x00000000034DA558>
    >>>
    puis sur "map" qui fabrique un iterator qui va appliquer une fonction à une liste d'"itérables".
    C'est beaucoup de vocabulaire à apprendre et vous avez un tas de tutos dans la rubrique notions de Python avancées qui traitent ces sujets.

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

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    291
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2005
    Messages : 291
    Points : 126
    Points
    126
    Par défaut
    Un grand merci.

    Pour m'exercer, j'essaie de convertir une chaîne de caractères vers une list int qui représente l'ASCII.
    par exemple: "AA\rBB" vers [65,65],[66,66]

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    list([map(lambda x: ord(x), line) for line in "aaAA\nBBB".split("\n")])
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [<map object at 0x00000174208A3A20>, <map object at 0x00000174208A3AC8>]
    Mais j'ai un résultat inutilisable ou que je ne comprends pas.

    Comment feriez-vous Cela ?

  6. #6
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 684
    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 684
    Points : 30 973
    Points
    30 973
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par zoltix Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    list([map(lambda x: ord(x), line) for line in "aaAA\nBBB".split("\n")])
    Bonjour

    Déjà les crochets intérieurs sont inutiles. En effet, list(generateur) va générer une liste à partir des itérations du générateur. Et donc list([generateur]) ne fera rien de plus.

    Citation Envoyé par zoltix Voir le message
    Mais j'ai un résultat inutilisable ou que je ne comprends pas.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [<map object at 0x00000174208A3A20>, <map object at 0x00000174208A3AC8>]
    Comment feriez-vous Cela ?
    En faisant un print(list(map(lambda x: ord(x), line) for line in "aaAA\nBBB".split("\n"))) ça fonctionne.
    Il faut se méfier du "python direct" car ce qu'il affiche est une "représentation" de l'objet. C'est à dire un truc représentant l'objet vu de python. Alors que si on demande explicitement print(truc) on obtient une "string" du truc, c'est à dire une vue de "truc" adaptée à l'humain. Ce sera plus clair quand tu créeras des objets et que tu implémenteras les méthodes "__repr__" et "__str__".
    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
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    291
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2005
    Messages : 291
    Points : 126
    Points
    126
    Par défaut
    Je comprends bien que c'est une représentation "humaine". Mais pour en finir avec cette question,
    comment je peux explorer/parcourir cette object pour voir/utiliser ce que j'ai mis dedans. car je vois

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     print(list(map(lambda x: ord(x), line) for line in "aaAA\nBBB".split("\n")))
    [<map object at 0x0000024746B95710>, <map object at 0x0000024746B957B8>]
    Et pourtant dans mon debuggeur, ca semble bien fonctionner. mais je n'y arrive pas en tapant le code.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    test = list([map(lambda x: ord(x), line) for line in "aaAA\nBBB".split("\n")])



    Donc comment je peux faire pour accéder à son contenu ?

  8. #8
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 281
    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 281
    Points : 36 768
    Points
    36 768
    Par défaut
    Salut,

    Citation Envoyé par zoltix Voir le message
    Comment feriez-vous Cela ?
    Avant de vouloir utiliser des constructions avancées de Python, vous devez apprendre les constructions de bases que sont les boucles for, les tests conditionnels,... et pour déjà écrire cela ainsi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    >>> result = []
    >>> for line in 'aa\nbb'.splitlines():
    ...     z = []
    ...     for ch in line:
    ...        z.append(ord(ch))
    ...     result.append(z)
    ...
    >>> result
    [[97, 97], [98, 98]]
    Une fois que vous maîtriserez ces constructions simples, il sera temps de vous intéresser aux list compréhensions:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    >>> [ [ ord(x) for x in line ] for line in 'aa\nbb'.splitlines() ]
    [[97, 97], [98, 98]]
    ou jouer avec "map"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    >>> [ list(map(ord, line)) for line in 'aa\nbb'.splitlines() ]
    [[97, 97], [98, 98]]
    >>>
    i.e. à faire, en plus concis, une suite d'opérations bien maîtrisée.

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

  9. #9
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    291
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2005
    Messages : 291
    Points : 126
    Points
    126
    Par défaut
    oups j'ai trouvé .....

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     test = list([map(lambda x: ord(x), line) for line in "aaAA\nBBB".split("\n")])
     
    for  i in test:
    	for n in i:
    	  print(n)

  10. #10
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    291
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2005
    Messages : 291
    Points : 126
    Points
    126
    Par défaut
    C'est génial..... le franc vient de tomber grâce à vous,

    Un grand merci pour cette aide.



    Citation Envoyé par wiztricks Voir le message
    Salut,



    Avant de vouloir utiliser des constructions avancées de Python, vous devez apprendre les constructions de bases que sont les boucles for, les tests conditionnels,... et pour déjà écrire cela ainsi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    >>> result = []
    >>> for line in 'aa\nbb'.splitlines():
    ...     z = []
    ...     for ch in line:
    ...        z.append(ord(ch))
    ...     result.append(z)
    ...
    >>> result
    [[97, 97], [98, 98]]
    Une fois que vous maîtriserez ces constructions simples, il sera temps de vous intéresser aux list compréhensions:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    >>> [ [ ord(x) for x in line ] for line in 'aa\nbb'.splitlines() ]
    [[97, 97], [98, 98]]
    ou jouer avec "map"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    >>> [ list(map(ord, line)) for line in 'aa\nbb'.splitlines() ]
    [[97, 97], [98, 98]]
    >>>
    i.e. à faire, en plus concis, une suite d'opérations bien maîtrisée.

    - W

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

Discussions similaires

  1. Méthode push dans un Array à plusieurs dimensions
    Par thibane dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 02/04/2008, 10h42
  2. Réponses: 1
    Dernier message: 21/09/2007, 14h42
  3. Réponses: 2
    Dernier message: 27/06/2007, 15h45
  4. [C#] Tableau et Array 2 dimension
    Par appwnet dans le forum Windows Forms
    Réponses: 5
    Dernier message: 22/10/2006, 14h46
  5. Réponses: 2
    Dernier message: 20/07/2006, 11h10

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