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 :

Y a-t-il un des "xx" caractères dans ma chaine ?


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre émérite
    Avatar de Antoine_935
    Profil pro
    Développeur web/mobile
    Inscrit en
    Juillet 2006
    Messages
    883
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur web/mobile

    Informations forums :
    Inscription : Juillet 2006
    Messages : 883
    Par défaut Y a-t-il un des "xx" caractères dans ma chaine ?
    Salute

    Je cherche à savoir si une chaine de caractère contient un des caractères *, ? ou [
    L'équivalent de ceci, en fait:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    >>> machaine = '/home/antoine/*'
    >>> for c in machaine:
    ...     if c in {'*', '?', '['}:
    ...         print("Oui")
    ...         break
    ... else:
    ...     print("Non")
    ... 
    Oui
    Je suis convaincu qu'il existait une fonction built-in pour ça... quelqu'un a une idée ?

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 759
    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 759
    Par défaut
    Salut,
    Je ne connais pas de tel builtins.
    Sinon, je procèderais plutôt ainsi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    >>> x = '/home/antoine/*'
    >>> any(x.count(c) for c in '*?[')
    True
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Membre Expert
    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
    Par défaut
    J'écrirais cela plutôt ainsi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    >>> x = '/home/antoine/*'
    >>> any(c in x for c in '*?[')
    C'est plus générique (s'applique à tout conteneur qui implémente __contains__), et potentiellement plus rapide (count parcourt toute la chaîne alors que in s'arrêtera à la première occurence).
    Pour reproduire le résultat du code original:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    >>> machaine = '/home/antoine/*'
    >>> ("Non","Oui")[any(c in x for c in '*?[')]
    'Oui'
    >>> # ou plus joli:
    >>> "Oui" if any(c in x for c in '*?[') else "Non"
    'Oui'

  4. #4
    Membre Expert
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 068
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 068
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    set(machaine).isdisjoint(set('*?['))
    retourne False si au moins un des caractère est présent ...

  5. #5
    Membre émérite
    Avatar de Antoine_935
    Profil pro
    Développeur web/mobile
    Inscrit en
    Juillet 2006
    Messages
    883
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur web/mobile

    Informations forums :
    Inscription : Juillet 2006
    Messages : 883
    Par défaut
    Hello

    Les deux premières solutions parcourront 3 fois ma chaine si aucun des trois caractères ne s'y trouve. C'est justement ce que je cherche à éviter...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    any(x.count(c) for c in '*?[')
    any(c in x for c in '*?[')
    J'aime bien la solution suivante
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    set(machaine).isdisjoint(set('*?['))
    Avec quelques petits aménagements...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    s = frozenset("*?[")
    s.isdisjoint(machaine)
    Reste à jeter un œuil au code de isdisjoint pour voir s'il traite ça comme il faut

    Merci à tous pour ces solutions

  6. #6
    Membre éclairé
    Avatar de Captain'Flam
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2011
    Messages
    273
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Février 2011
    Messages : 273
    Billets dans le blog
    1
    Par défaut
    Si je puis me permettre d'ajouter mon grain de sel : combien ça coûte de convertir une chaîne en set ?
    A chaque caractère de la chaîne il va chercher s'il est déjà présent dans le set, non ?

    => parcours en n² au lieu de n...

    à moins d'une optimisation du genre : si c'est un set de caractères (sur 8 bits), il est implémenté avec un tableau de 256 bits.

    Là il nous faut un expert qui connaisse les détails d'implémentation.

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