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 :

joindre les éléments d'une liste


Sujet :

Python

  1. #1
    Membre émérite
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 41
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : octobre 2006
    Messages : 3 157
    Points : 2 673
    Points
    2 673
    Par défaut joindre les éléments d'une liste
    Bonjour à tous,

    Mon dictionnaire a comme valeurs des listes, associées à ses clés.
    J'aimerais afficher le tout sur une ligne (pour construire un tableau par itération).

    J'ai trouvé cette solution par des recherches sur internet :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    print ("\t".join(table_data_s[source_name]))
    Mais, j'obtiens l'erreur :
    TypeError: sequence item 0: expected str instance, list found
    Ai-je commis une erreur, y a-t'il eu des changements sous python 3 (que j'utilise) ?

    D'avance merci,
    -- Jasmine --

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    juin 2008
    Messages
    18 684
    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 : 18 684
    Points : 32 257
    Points
    32 257
    Par défaut
    Salut,

    Citation Envoyé par Jasmine80 Voir le message
    Mais, j'obtiens l'erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TypeError: sequence item 0: expected str instance, list found
    Ai-je commis une erreur, y a-t'il eu des changement sous python 3 (que j'utilise) ?
    Relisez le message d'erreur, il dit que le premier élément de la séquence récupérée dans "table_data_s[source_name]" est une liste et non une chaîne de caractères.
    Exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    >>> L = [ [1, 2, 3] for _ in range(3) ]
    >>> L
    [[1, 2, 3], [1, 2, 3], [1, 2, 3]]
    >>> ' '.join(L)
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    TypeError: sequence item 0: expected str instance, list found
    Une solution pourrait être:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    >>> 'X'.join(str(e) for e in L)
    '[1, 2, 3]X[1, 2, 3]X[1, 2, 3]'
    >>>
    Mais ca dépend de vos données et du rendu que vous voulez avoir côté chaine de caractères.

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

  3. #3
    Membre émérite
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 41
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : octobre 2006
    Messages : 3 157
    Points : 2 673
    Points
    2 673
    Par défaut
    Bonjour Wiztricks,

    Merci pour votre réponse.

    pprint, sur mon dictionnaire 'table_data_s' me donne ceci :
    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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    {'IMU10-1-24-R-1-1': [['IMU10-1-24-R-1-1',
                           'RPTEC/TERT1',
                           'Homo sapiens',
                           'Male',
                           '1',
                           '1',
                           'dimethyl sulfoxide',
                           'IAZDPXIOMUYVGZ-UHFFFAOYSA-N',
                           'CHEMBL504',
                           '',
                           'DMSO',
                           'TRUE',
                           '',
                           '0.1',
                           'percent',
                           '24',
                           'DMSO']],
     'IMU10-1-24-R-2-1': [['IMU10-1-24-R-2-1',
                           'RPTEC/TERT1',
                           'Homo sapiens',
                           'Male',
                           '2',
                           '1',
                           'dimethyl sulfoxide',
                           'IAZDPXIOMUYVGZ-UHFFFAOYSA-N',
                           'CHEMBL504',
                           '',
                           'DMSO',
                           'TRUE',
                           '',
                           '0.1',
                           'percent',
                           '24',
                           'DMSO']],
     'IMU10-1-24-R-3-1': [['IMU10-1-24-R-3-1',
                           'RPTEC/TERT1',
                           'Homo sapiens',
                           'Male',
                           '3',
                           '1',
                           'dimethyl sulfoxide',
                           'IAZDPXIOMUYVGZ-UHFFFAOYSA-N',
                           'CHEMBL504',
                           '',
                           'DMSO',
                           'TRUE',
                           '',
                           '0.1',
                           'percent',
                           '24',
                           'DMSO']], ...
    Je n'avais pas fait attention à ces doubles crochets.

    Voici comment je le génère :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    f = open('s_DIXA003.txt','r')
    lines_s  = f.readlines()
    f.close()
     
    table_data_s = {}
     
    for e in lines_s:
    	source_name = re.search('^([^\t]*)\t', e).group(1)
    	table_data_s[source_name]= [ e.rstrip('\n').split('\t')]
    Je sais que Join() attend un string mais j'aimerais l'utiliser sur cette liste.

    Merci.
    -- Jasmine --

  4. #4
    Membre émérite
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 41
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : octobre 2006
    Messages : 3 157
    Points : 2 673
    Points
    2 673
    Par défaut
    En fin de compte, j'ai modifié mon dictionnaire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for e in lines_s:
    	source_name = re.search('^([^\t]*)\t', e).group(1)
    	table_data_s[source_name]= e
    ...mais j'aimerais quand même comprendre d'où me venait ces doubles crochets et comment faire un join sur une liste.

    Merci
    -- Jasmine --

  5. #5
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    juin 2008
    Messages
    18 684
    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 : 18 684
    Points : 32 257
    Points
    32 257
    Par défaut
    Salut,

    La liste de liste vient de cette ligne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    	table_data_s[source_name]= [ e.rstrip('\n').split('\t')]
    .split retourne déjà une liste de "str".

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

  6. #6
    Expert confirmé Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    mars 2009
    Messages
    2 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : mars 2009
    Messages : 2 463
    Points : 5 454
    Points
    5 454
    Par défaut
    Quelques remarques à propos de tes codes:

    Pour le premier code:
    Puisque tu te débarrasses de \n avec rstrip, tu peux le faire directement à la génération de la liste de lignes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    f = open('s_DIXA003.txt','r')
    lines_s  = f.read().splitlines
    f.close()
    Comme ça, pas besoin d'utiliser rstrip par la suite pour éliminer le LF.
    Ensuite pourquoi utiliser re.search(r'^([^\t]*)\t', e) autant splitter directement chaque ligne aux tabulations:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for e in lines_s:
        parts = e.split('\t')
        table_data_s[parts[0]] = parts
    Comme l'a signalé wiztricks, e.split('\t') renvoie déjà une liste, donc si tu places des crochets autour tu obtiendras une liste dont le premier et unique élément est une autre liste.

    Même chose pour le deuxième code, sauf qu'il faut limiter le split:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for e in lines_s:
        table_data_s[e.split('\t', 1)[0]] = e
    Enfin, si je devais faire la même chose, je lirais plutôt le fichier ligne par ligne en peuplant au fur et à mesure mon dictionnaire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    with open('s_DIXA003.txt') as f:
        for line in f:
            parts = line.rstrip('\n').split('\t')
            table_data_s[parts[0]] = parts
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

  7. #7
    Membre émérite
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 41
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : octobre 2006
    Messages : 3 157
    Points : 2 673
    Points
    2 673
    Par défaut
    Bonjour wiztricks et CosmoKnacki,

    Merci pour vos réponses.

    Citation Envoyé par CosmoKnacki Voir le message
    Puisque tu te débarrasses de \n avec rstrip, tu peux le faire directement à la génération de la liste de lignes:[code]f = open('s_DIXA003.txt','r')
    lines_s = f.read().splitlines
    C'est plus intelligent, en effet !

    Citation Envoyé par CosmoKnacki Voir le message
    Ensuite pourquoi utiliser re.search(r'^([^\t]*)\t', e) autant splitter directement chaque ligne aux tabulations:
    Enfin, si je devais faire la même chose, je lirais plutôt le fichier ligne par ligne en peuplant au fur et à mesure mon dictionnaire:
    Est-ce tu ferais ainsi, par ce que c'est mieux niveau performance ?
    -- Jasmine --

  8. #8
    Expert confirmé Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    mars 2009
    Messages
    2 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : mars 2009
    Messages : 2 463
    Points : 5 454
    Points
    5 454
    Par défaut
    En ce qui concerne le fait de te passer du re.search et de tout splitter au simple caractère TAB, le gain en vitesse est garanti.

    Au sujet de la lecture ligne par ligne: du point de vue vitesse, je ne pense pas que ça risque de gréver les performances (cela dit je n'ai pas pu tester sur ce fameux fichier uniquement accessible aux élus), par contre du point de vue mémoire, tu évites la présence simultanée du contenu du fichier et du dictionnaire, donc tu y gagnes. Maintenant je procéderais de cette manière un peu par réflexe, parce que les itérateurs sont au cœur du langage (l'idée principale étant de stocker le moins possible et de faire le maximum de chose au fur et à mesure. Ça n'est pas forcément en adéquation avec ce que l'on souhaite faire, mais tout est là pour pouvoir le faire.).

    Du point de vue vitesse sur un gros fichier la lecture ligne par ligne donne de bien meilleurs résultats, sur des petits fichiers, la lecture en un bloc sera meilleure mais la différence avec une lecture ligne par ligne dans ce cas est faible (et se réduit à mesure que la taille du fichier grandit). Maintenant la question se pose si on doit traiter une multitude de petits fichiers. Donc pour avoir la meilleur des solutions tu dois tester toi même en fonction de tes fichiers à traiter.
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

  9. #9
    Membre émérite
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 41
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : octobre 2006
    Messages : 3 157
    Points : 2 673
    Points
    2 673
    Par défaut
    Merci beaucoup, je peux cliquer sur le bouton 'résolu'.
    -- Jasmine --

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

Discussions similaires

  1. Goal : Joindre les éléments d'une liste avec un séparateur
    Par Lorantus dans le forum Général Java
    Réponses: 4
    Dernier message: 03/12/2015, 15h29
  2. Réponses: 1
    Dernier message: 21/04/2007, 17h36
  3. Réponses: 12
    Dernier message: 04/03/2007, 12h43
  4. Tri aléatoire parmis les éléments d'une liste
    Par ahouba dans le forum Access
    Réponses: 2
    Dernier message: 29/06/2006, 19h03
  5. Réponses: 3
    Dernier message: 15/05/2006, 17h09

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