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 :

respecter l'ordre de la chaine


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Mai 2019
    Messages
    67
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Mai 2019
    Messages : 67
    Par défaut respecter l'ordre de la chaine
    bonjour,

    j'aimerai savoir comment faire respecter l'ordre des mots trouvés dans la liste qui corresponde a la chaine de caractère.
    aléatoirement la valeur de x peut avoir comme résultat CARACTERE et CHAINE tout comme CHAINE et CARACTERE. J'aimerai que le résultat soit à l'identique que la chaine de caractère soit CHAINE et CARACTERE.
    y a t il un moyen de forcer cela?
    voici le code ci-dessous

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    import os
    ch = "VOICI_UNE_CHAINE_DE_CARACTERE_COMME_EXEMPLE"
    ch1 = ch.replace('_', ' ').split()
    chaine = set(ch1)
    les_mots = set(('MAISON', 'VILLE', 'CHAINE', 'ARBRE', 'CARACTERE'))
    mots = chaine&les_mots
    x = list(mots)
    print(x)
    merci pour votre aide

  2. #2
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 832
    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 832
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par frederic2710 Voir le message
    j'aimerai savoir comment faire respecter l'ordre des mots trouvés dans la liste qui corresponde a la chaine de caractère.
    y a t il un moyen de forcer cela?
    Un ensemble aura l'avantage de ne pas avoir de doublon mais l'inconvénient de ne pas garantir que l'ordre des éléments en sortie sera identique à celui en entrée.
    Si cet inconvénient est critique, tu ne peux pas utiliser set().

    Citation Envoyé par frederic2710 Voir le message
    ch1 = ch.replace('_', ' ').split()
    ch1 = ch.split("_")
    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]

  3. #3
    Invité
    Invité(e)
    Par défaut
    Salut !

    Une proposition qui reprend l'intérêt du set (supprimer les doublons) tout en gardant l'ordre (enfin je crois) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    list({mot:None for mot in ch.split("_")})
    ['VOICI', 'UNE', 'CHAINE', 'DE', 'CARACTERE', 'COMME', 'EXEMPLE']

  4. #4
    Membre Expert
    Avatar de MPython Alaplancha
    Homme Profil pro
    Paysan à 3 francs six sous
    Inscrit en
    Juin 2018
    Messages
    923
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Paysan à 3 francs six sous
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Juin 2018
    Messages : 923
    Billets dans le blog
    8
    Par défaut
    Bonjour,
    Citation Envoyé par Sve@r

    ch1 = ch.split("_")
    Citation Envoyé par fatbob
    Déjà tu peux splitter par rapport à un caractère donné (ça ne fait pas avancer ton problème mais bon).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    import os
    ch = "VOICI_UNE_CHAINE_DE_CARACTERE_COMME_EXEMPLE"
    ch1 = ch.split('_')
    Peut-être qu'à force de répétition, cela sera entendu

    -----------------------------------------------------------------------------------------------------------------------------------------------------------------------------

    Citation Envoyé par LeNarvalo Voir le message
    Salut !

    Une proposition qui reprend l'intérêt du set (supprimer les doublons) tout en gardant l'ordre (enfin je crois) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    list({mot:None for mot in ch.split("_")})
    ['VOICI', 'UNE', 'CHAINE', 'DE', 'CARACTERE', 'COMME', 'EXEMPLE']
    bof: utiliser un dico dont on utilise pas les valeurs....
    les dicos sont effectivement ordonnés depuis python3.7
    Autant partir sur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    >>> for mot in ch.split('_'):
    	if mot not in l:
    		l.append(mot)

  5. #5
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 832
    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 832
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Hominidé Voir le message
    Peut-être qu'à force de répétition, cela sera entendu
    Effectivement. Je n'avais pas été sur son autre topic mais je viens d'aller voir et en effet, cela lui avait déjà été dit là bas. Je suis d'accord avec toi, dire les choses et voir que celui à qui on les dit n'en a rien à carrer c'est soûlant

    Citation Envoyé par Hominidé Voir le message
    bof: utiliser un dico dont on utilise pas les valeurs....
    Non, moi je trouve ça bien trouvé. Il utilise un des avantages du dico pour son besoin, ça tient sur une ligne, c'est joli. Et bon il n'utilise pas les autres avantages (comme tu le dis le fait de pouvoir associer des valeurs aux clefs) mais doit-on forcément tout utiliser dans un outil pour avoir le droit d'utiliser ledit outil? N'oublie pas que le append() sur une liste (comme tu le montres à la fin) est un mécanisme assez lourd.

    Citation Envoyé par Hominidé Voir le message
    les dicos sont effectivement ordonnés depuis python3.7
    Auparavant il y avait le collections.OrderedDict (qui je dois dire m'a beaucoup aidé à l'époque). Mais effectivement je suis content que P3 ait admis que c'était plus pratique
    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]

  6. #6
    Invité
    Invité(e)
    Par défaut
    Ma méthode semble plus rapide pour des textes de plusieurs dizaines de mots mais un peu moins pour des textes courts.
    (J'ai fais qu'un test ^^)

  7. #7
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 832
    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 832
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par LeNarvalo Voir le message
    Ma méthode semble plus rapide pour des textes de plusieurs dizaines de mots mais un peu moins pour des textes courts.
    Effectivement...

    Code python : 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
    #!/usr/bin/env python3
    # coding: utf-8
     
    import random
    import timeit
    from functools import partial
     
    # Initialisation random
    random.seed()
     
    # Les fonctions à tester
    def narvalo(l): return list({mot:None for mot in l.split("_")})
    def hominide(l):
    	ll=list()
    	for mot in l.split('_'):
    		if mot not in ll: ll.append(mot)
    	return ll
    # hominide()
     
    fct={
    	"narvalo" : narvalo,
    	"hominide" : hominide,
    }
     
    # Les données à traiter
    data = "VOICI_UNE_CHAINE_DE_CARACTERE_COMME_EXEMPLE" * 1000
     
    # Vérification
    assert narvalo(data) == hominide(data)
    print("Assertion ok")
     
    # Le nombre de répétitions (les moyennes se feront sur cette valeur)
    repeat=20
     
    # Appel des fonctions dans un ordre aléatoire et affichage du chrono
    print("taille data=%d, repeat=%d" % (len(data), repeat))
    for (k, v) in random.sample(tuple(fct.items()), len(fct)):
    	t=timeit.Timer(partial(v, data)).repeat(repeat=repeat, number=50_000)
    	print("%s: min=%f, max=%f, avg=%f" % (k, min(t), max(t), sum(t)/len(t)))
    # for

    Au final:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $ python3 essai.py 
    Assertion ok
    taille data=43000, repeat=20
    hominide: min=20.378302, max=21.194840, avg=20.599099
    narvalo: min=18.179887, max=18.641876, avg=18.295902
    Effectivement sur un texte court tu n'as pas l'avantage (sur la chaine d'origine tu es perdant). Tu commences à prendre tes marques sur un texte contenant des répétitions (ça semble logique après coup, dans la boucle de Hominidé, chaque nouveau mot réévalue toute la chaine existante).
    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
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 062
    Par défaut
    Bonjour,

    Je ne sais pas si j'ai tout compris à la demande initiale, mais je propose une solution liée à ma compréhension

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    ch = "VOICI_UNE_CHAINE_DE_CARACTERE_COMME_EXEMPLE"
     
    words = ch.split("_")
    w = set(('MAISON', 'VILLE', 'CHAINE', 'ARBRE', 'CARACTERE'))
     
    print([word for word in words if word in (set(words) & w)])
    Bon dimanche !

Discussions similaires

  1. Respecter l'ordre des colonnes
    Par Invité dans le forum Windows Forms
    Réponses: 6
    Dernier message: 05/06/2008, 09h54
  2. Réponses: 8
    Dernier message: 08/02/2008, 23h13
  3. [MySQL] résultat respectant l'ordre de la clause WHERE OR ?
    Par gueridon dans le forum Langage SQL
    Réponses: 7
    Dernier message: 26/08/2007, 00h18
  4. Respecter l'ordre d'affichage
    Par evincent dans le forum Mise en forme
    Réponses: 2
    Dernier message: 27/03/2007, 03h50
  5. algo de compression respectant l ordre
    Par polux dans le forum Algorithmes et structures de données
    Réponses: 6
    Dernier message: 06/06/2005, 20h41

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