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

  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 829
    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 829
    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
    920
    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 : 920
    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 829
    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 829
    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 829
    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 829
    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
    Invité
    Invité(e)
    Par défaut
    Et avec un texte plus probable :

    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
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    #!/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 = '''Python est un langage portable, dynamique, extensible, gratuit, qui permet (sans l'imposer) une approche modulaire et orientée objet de la programmation. Python est développé depuis 1989 par Guido van Rossum et par de nombreux contributeurs bénévoles. Il est récupérable gratuitement sur le site https://www.python.org.
     
    Le nom du langage provient de l’émission de la BBC « Monty Python’s Flying Circus »(1) et n’a rien à voir avec les reptiles.
     
    I-1. Pourquoi programmer en Python ?▲
    Aucun langage de programmation n'est parfait. Il n'existe même pas un langage meilleur que d'autres ; il n'y a que des langages en adéquation ou peu conseillés pour des buts particuliers. (Herbert Mayer).
     
    Python n’est pas le meilleur langage pour quoi que ce soit. Pour travailler sur du texte, Perl est meilleur. Pour de l’intelligence artificielle, Lisp est meilleur. Pour de l’embarqué, C est meilleur. Pour de l’asynchrone, JavaScript est meilleur.
     
    Non. Python n’est pas le meilleur, mais seulement très bon. Toutefois, il est très bon pour tout. Python est excellent pour analyser du texte, pour faire un site web (même asynchrone), de l’administration système, des interfaces graphiques, du calcul scientifique, de la 3D, des robots d’indexation, etc. Pas le meilleur, mais très bon.
     
    Et ceci est totalement suffisant. Cela veut dire que pour commencer un projet, n’importe quel projet, on peut partir tranquille avec Python. On ne sera pas bloqué plus tard par tel ou tel besoin. On pourra s’en sortir agréablement avec Python.
     
    Vous faites un site en JavaScript? Pour le sysadmin, il va falloir un autre langage…
     
    Des scripts de maintenance en Perl? J’espère que vous n’aurez pas besoin d’une GUI…
     
    Un crawler en PHP ? Pour l’analyse des données récupérées, vous allez vous amuser…
     
    De l’extraction de données en Ruby ? Pourvu qu’il ne faille pas traiter plusieurs To…
     
    Ce n’est pas que vous ne pourrez pas ; ils sont tous « Turing complet » après tout. Mais vous allez vraiment galérer.
     
    Aucun langage n’est parfait, et Python n’est pas une exception. Mais dans 99% des cas, vous pouvez avoir une solution propre et efficace en Python à la problématique que vous ne savez même pas encore que vous aurez. Et le jour où vous atteindrez la limite, alors oui, vous pourrez utiliser une autre technologie pour la contourner. Mais juste pour cette partie. La plupart du temps, ce sera une partie très réduite. Et en plus, Python pourra probablement s’interfacer nativement avec le code de l’autre langage.
     
    Il y a des tas de raisons de ne pas choisir Python bien entendu, mais probablement la meilleure raison de le choisir, c’est qu’il y a peu de chance de se planter.
     
    I-2. Caractéristiques principales▲
    Détaillons un peu les principales caractéristiques de Python, plus précisément, du langage et de ses différentes implantations actuelles :
     
    Python est portable, non seulement sur les différentes variantes d'Unix, mais aussi sur les OS propriétaires (MacOS, BeOS, NeXTStep, MS-DOS) et les différentes variantes de Windows ;
    Python est gratuit, mais on peut l'utiliser sans restriction dans des projets commerciaux ;
    Python convient aussi bien à des scripts d'une dizaine de lignes qu'à des projets complexes de plusieurs dizaines de milliers de lignes ;
    la syntaxe de Python est très simple et, combinée à des types de données évolués (listes, dictionnaires, objets…), conduit à des programmes à la fois très compacts et très lisibles. À fonctionnalités égales, un programme Python (abondamment commenté et présenté selon les canons standards) est souvent de 3 à 5 fois plus petit qu'un programme C ou C++ ou même Java équivalents, ce qui entraine en général un temps de développement de 5 à 10 fois plus court et une facilité de maintenance largement accrue ;
    Python gère ses ressources (mémoire, descripteurs de fichiers…) sans intervention du programmeur, par un mécanisme de comptage de références proche d'un garbage collector ;
    Python est (optionnellement) multithreadé ;
    Python est orienté objet. Il supporte l'héritage multiple et la surcharge des opérateurs ;
    Python intègre un système d'exceptions qui permettent de simplifier considérablement la gestion des erreurs ;
    Python est dynamique (l'interpréteur peut évaluer des chaînes de caractères représentant des expressions ou des instructions Python), orthogonal (un petit nombre de concepts suffit à engendrer des constructions très riches), réflexif (il supporte la métaprogrammation, par exemple la capacité pour un objet de se rajouter ou de s'enlever des attributs ou des méthodes, ou même de changer de classe en cours d'exécution) et introspectif (un grand nombre d'outils de développement, comme le débogueur ou le profiler, sont implantés en Python lui-même) ;
    Python est dynamiquement typé. Tout objet manipulable par le programmeur possède un type bien défini à l'exécution, qui n'a pas besoin d'être déclaré à l'avance ;
    Python est extensible : on peut facilement l'interfacer avec des bibliothèques C existantes. On peut aussi s'en servir comme d'un langage d'extension pour des systèmes logiciels complexes ;
    la bibliothèque standard de Python et les paquetages externes donnent accès à une grande variété de services : chaînes de caractères et expressions régulières, services Unix standards (fichiers, pipes, signaux, sockets, threads…), accès Internet (web, news, ftp, cgi, html…), persistance et bases de données, interfaces graphiques ;
    Python est un langage qui continue à évoluer, soutenu par une communauté d'utilisateurs enthousiastes et responsables, dont la plupart sont des supporters du logiciel libre. Parallèlement à l'interpréteur principal, écrit en C et maintenu par le créateur du langage, un deuxième interpréteur écrit en Java est en cours de développement.
    I-3. Python 2 ou Python 3 ?▲
    En 2007 Python a subi une évolution majeure de Python 2 vers Python 3. Les évolutions de cette version associées à un ménage majeur destiné à clarifier le code ont rendu toute compatibilité ascendante et descendante impossible à assurer, ce qui rend ces deux versions totalement incompatibles l’une avec l’autre (sauf à passer exclusivement par la partie qui est restée commune, ce qui réduit alors nettement les possibilités offertes par ces deux versions).
     
    Il était prévu à l’origine que Python 2 soit abandonné en 2015 (soit huit ans après). Cependant, devant l’énorme masse de bibliothèques et outils écrits en Python 2 devant être portés sous Python 3 ; face à la demande massive des développeurs n’ayant pas la possibilité matérielle de faire ce travail (venant en supplément), et dont certains considéraient encore en 2015 que Python 3 manquait encore de maturité (on a même cru un moment qu'un Python 4 arriverait avant la mort de Python 2) ; la communauté a décidé de continuer à assurer une évolution et un suivi de Python 2 qui se sont terminés définitivement au 1er janvier 2020.
     
    La question du choix entre la version 2 ou 3 de Python ne devrait donc plus se poser. Néanmoins, il est important de savoir qu’il existe toujours de nombreux programmes qui utilisent Python 2. Ce tutoriel est donc majoritairement écrit pour Python 3 mais avec des exemples généralement utilisables dans les deux versions (2 et 3) et les quelques exemples spécifiques v2 ou v3 seront marqués à cet effet.
     
    La dernière version (par rapport à ce document) de Python 2 est la 2.7.18 (version définitive pour Python 2 sortie en avril 2020) et la dernière version de Python 3 est la 3.10.0 (sortie en octobre 2021).'''
     
    # 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
    Boom ! 💥
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Assertion ok
    taille data=7481, repeat=5
    narvalo: min=1.206852, max=1.242151, avg=1.224143
    hominide: min=16.023864, max=17.770730, avg=16.603394

  9. #9
    Membre Expert
    Avatar de MPython Alaplancha
    Homme Profil pro
    Paysan à 3 francs six sous
    Inscrit en
    Juin 2018
    Messages
    920
    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 : 920
    Billets dans le blog
    8
    Par défaut
    Bonjour,
    après si on court après le temps, voir si deque (normalement les append() devraient être plus rapides qu'avec une liste) ou numpy seraient plus efficaces...

  10. #10
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 060
    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 060
    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