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 :

Chaîne de mots


Sujet :

Python

  1. #1
    Candidat au Club
    Inscrit en
    Novembre 2010
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Novembre 2010
    Messages : 5
    Points : 4
    Points
    4
    Par défaut Chaîne de mots
    Bonsoir,
    je débute en Python, je désire écrire un programme qui détermine dans une phrase le mot contenant le plus de lettre différente.
    Pour cela j'ai déjà écrit le programme qui détermine dans une phrase le mot le plus long.

    Mon idée est d'isoler chaque mot dans une liste puis de comparer leur longueur initiale à la longueur du mot auquel on a enlevé le premier a,b,c....
    Mon problème est qu'a partir de s='monthy python', je crée
    l=s.split()=[monthy,python]
    mais pour retirer les lettres je doit faire de 'monthy' une liste.
    comment faire?
    Merci d'avance.

  2. #2
    Membre expérimenté
    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
    Points : 1 384
    Points
    1 384
    Par défaut
    Bonjour,

    si tu veux transformer une chaîne de caractères s en liste, c'est tout simplement list(s).
    Mais je ne comprends pas bien la façon dont tu veux procéder pour trouver le mot comportant le plus de lettres différentes. Moi j'utiliserais un ensemble (type set).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    >>> set('abracadabra')
    set(['a', 'r', 'b', 'c', 'd'])
    >>> len(set('abracadabra'))
    5

  3. #3
    Candidat au Club
    Inscrit en
    Novembre 2010
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Novembre 2010
    Messages : 5
    Points : 4
    Points
    4
    Par défaut
    Tout d'abord merci pour la réponse.
    Je doit partir d'une liste de plus de 300 000 mots chacun séparés par un espace. Pour mon programme prend un exemple s='abce abbccddeeff'
    je crée un liste l=[abcde,abbccddeeff]
    je crée un boucle qui retire grâce a "remove" le premier a, b, c, d.... de L[0],L[1]
    je trouve
    L[0]=''
    L[1]=abcdef

    puis je calcule la différence des éléments avant et après modif
    pour L[0]=3-0=>4 lettres différentes
    pour L[1]=10-5=>6 lettres différentes

  4. #4
    Candidat au Club
    Inscrit en
    Novembre 2010
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Novembre 2010
    Messages : 5
    Points : 4
    Points
    4
    Par défaut
    j'ai une autre question concernant ce programme qui cherche dans une séquence le mot avec le plus de 'e'. Il me renvoie deux fois le premier mot qui rentre dans la liste q.

    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
    >>> def maxe(s):
    	M=0
    	p=[]
    	L = s.split()
    	B=s.split()
    	for c in range (0, len(L)):
    		l=len(L[c])
    		L[c]=L[c].replace('e','')
    		le=len(L[c])
    		A=l-le
    		if A>M:
    			M=A
    			p=[]
    			p.extend([c])
    		if A==M:
    			p.extend([c])
    	print(p)
    	for i in range (0,len(p)):
    		print(B[p[i]]);
     
     
    >>> maxe(s)
    [2, 2]
    enregistrement
    enregistrement

  5. #5
    Membre expérimenté
    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
    Points : 1 384
    Points
    1 384
    Par défaut
    Ton exemple contient des erreurs, mais je crois avoir compris la logique. Mais la solution avec set est plus simple et plus efficace.

  6. #6
    Membre expérimenté
    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
    Points : 1 384
    Points
    1 384
    Par défaut
    Dans ton premier if tu fais M = A. Ce qui fait que les instructions dans le second if sont toujours exécutées, la condition A == M étant toujours vérifiée.
    Solution simple: changer le second if en elif.

    Maintenant, il y aurait beaucoup d'autres choses à dire sur ce code.
    Une version simplifiée, qui reste dans le même esprit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    def maxe(s):
        M = 0
        p = []
        for w in s.split():
            A = w.count('e')
            if A > M:
                M = A
                p = [w]
            elif A == M:
                p.append(w)
        for w in p:
            print(w)
    Remarque, en particulier, qu'il n'est souvent pas nécessaire de faire un for sur les indices d'une liste, on peut boucler sur les éléments de la liste directement. Et aussi la méthode count sur les chaînes de caractères, qui est bien utile ici.

  7. #7
    Rédacteur
    Avatar de Zavonen
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 772
    Détails du profil
    Informations personnelles :
    Âge : 76
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 772
    Points : 1 913
    Points
    1 913
    Par défaut
    Une simple remarque d'ordre pratique.
    La liste de 300000 mots étudiée est certainement issue de la lecture d'un fichier.
    Je pense donc que pour résoudre le problème particulier posé, il n'y a pas besoin de construire cette longue liste. Il suffit de lire les mots dans le fichier les uns après les autres. On peut utiliser la méthode suggérée par Dividee parfaite pour compter les lettres distinctes d'un mot.Le record enregistré et le mot correspondant sont stockés en permanence dans deux variables distinctes avec mise à jour à chaque fois que le record est battu. A la fin on a le résultat cherché sans avoir construit aucune liste.
    Ce qu'on trouve est plus important que ce qu'on cherche.
    Maths de base pour les nuls (et les autres...)

Discussions similaires

  1. Réponses: 15
    Dernier message: 17/10/2006, 12h06
  2. [RegEx] Trouver tous les "/mot" dans une chaîne
    Par micatmidog dans le forum Langage
    Réponses: 7
    Dernier message: 31/03/2006, 12h07
  3. Compter nombre de mots dans une chaîne.
    Par xVINCEx dans le forum C++
    Réponses: 22
    Dernier message: 24/11/2004, 13h33
  4. Suppression de mots dans une chaîne
    Par psychomatt dans le forum Langage
    Réponses: 7
    Dernier message: 06/08/2004, 15h34
  5. Comptage de mots dans une chaîne
    Par kikinou dans le forum Pascal
    Réponses: 10
    Dernier message: 01/01/2003, 02h27

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