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 :

récupérer les index d'une occurence présente plusieurs fois dans une liste


Sujet :

Python

  1. #1
    Membre averti Avatar de nekcorp
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2006
    Messages
    592
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2006
    Messages : 592
    Points : 383
    Points
    383
    Par défaut récupérer les index d'une occurence présente plusieurs fois dans une liste
    salut à tous,

    Alors voilà je souhaite récupérer les index d'une occurrence présente plusieurs fois dans une liste.

    Je sais comment récupérer l'index d'une occurrence dans une liste grâce à la méthode index(), mais lorsque celle ci apparait plusieurs fois je ne sais pas comment récupérer l'ensemble des index où celle ci apparait dans la liste.

    Un exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    >>> L=["toto", "titi", "tutu", "tata", "tete", "toto"]
    >>> L.index("toto")
    0
    Est ce qu'il existe une méthode qui permet par exemple de récupérer un tuple des index de l'occurrence recherché, ou alors il faut la créer soit même ?

    Merci d'avance pour vos réponses.

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 281
    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 281
    Points : 36 768
    Points
    36 768
    Par défaut
    Citation Envoyé par nekcorp Voir le message
    Est ce qu'il existe une méthode qui permet par exemple de récupérer un tuple des index de l'occurrence recherché, ou alors il faut la créer soit même ?
    Avec les méthodes de l'objet "list", il faut la construire (avec des itérations en utilisant .index par exemple).

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

  3. #3
    Membre averti Avatar de nekcorp
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2006
    Messages
    592
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2006
    Messages : 592
    Points : 383
    Points
    383
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Avec les méthodes de l'objet "list", il faut la construire (avec des itérations en utilisant .index par exemple).

    - W
    C'est ce que je me disais, mais j'aurai espéré qu'une méthode de "list" aurait pu le faire pour moi

    Merci

  4. #4
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 812
    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 : 3 812
    Points : 7 097
    Points
    7 097
    Par défaut
    Eh bien ça le fait, non ? On ne va tout de même pas prévoir pour n'importe quelle situation une méthode spécifique... Autant en faire une générale, et qu'on adapte selon ses besoins.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    def get_indexes(my_list, s):
        start = 0
        while True:
            try:
                index = my_list.index(s, start)
                start = index+1
                yield index
            except ValueError:
                break
     
    L = ["toto", "titi", "tutu", "tata", "tete", "toto"]
    indexes = get_indexes(L, 'toto')
    print(list(indexes))
    Dans les exemples de la documentation, on voit très bien le chemin à mener pour résoudre ton problème.
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

  5. #5
    Membre confirmé
    Homme Profil pro
    Développeur banc de test
    Inscrit en
    Mai 2014
    Messages
    199
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur banc de test
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mai 2014
    Messages : 199
    Points : 482
    Points
    482
    Par défaut
    Bonjour,

    voici une version qui utilise enumerate et génère un dictionnaire (désordonné) contenant la liste des index de chaque clé/nom unique.

    L'exemple donné dans la documentation sur defaultdict montre exactement le même cas de figure pour regrouper un ensemble de key-values : https://docs.python.org/3/library/co...tdict-examples

    defaultdict va permettre de créer à la volé une clé dont la valeur par défaut sera une liste vide.

    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
    from collections import defaultdict
     
    L = ["toto", "titi", "tutu", "tata", "tete", "toto"]
     
     
    d_indexes = defaultdict(list)
     
    for index, value in enumerate(L):
        d_indexes[value].append(index)
     
     
    print(list(d_indexes.items()))
     
    # [('tata', [3]), ('titi', [1]), ('tete', [4]), ('toto', [0, 5]), ('tutu', [2])]
     
    print(d_indexes['toto'])
     
    # [0, 5]

  6. #6
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 461
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 461
    Points : 9 248
    Points
    9 248
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Et comme ça?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    L = [1,0,3,9,5,2,5,7,8,4,3,5]
    print([indice for indice, valeur in enumerate(L) if valeur==5])
    [4, 6, 11]
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  7. #7
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 812
    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 : 3 812
    Points : 7 097
    Points
    7 097
    Par défaut
    Après si on cherche plus dans la performance on peut attaquer dans les arrays numpy

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    >>> import numpy as np
    >>> L = np.array(["toto", "titi", "tutu", "tata", "tete", "toto"])
    >>> indexes, *_ = np.where(L == 'toto')
    >>> indexes
    array([0, 5])
    Tout dépend de la réelle longueur de la liste, peut-être que les tableaux sont plus adaptés...

    L'autre possibilité est de créer une fonction C faisant cela, avec cython ou l'API C par exemple. C'est pas bien compliqué à faire si on connaît le C voir le C++.
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

  8. #8
    Membre averti Avatar de nekcorp
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2006
    Messages
    592
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2006
    Messages : 592
    Points : 383
    Points
    383
    Par défaut
    Citation Envoyé par fred1599 Voir le message
    Eh bien ça le fait, non ? On ne va tout de même pas prévoir pour n'importe quelle situation une méthode spécifique... Autant en faire une générale, et qu'on adapte selon ses besoins.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    def get_indexes(my_list, s):
        start = 0
        while True:
            try:
                index = my_list.index(s, start)
                start = index+1
                yield index
            except ValueError:
                break
     
    L = ["toto", "titi", "tutu", "tata", "tete", "toto"]
    indexes = get_indexes(L, 'toto')
    print(list(indexes))
    Dans les exemples de la documentation, on voit très bien le chemin à mener pour résoudre ton problème.
    Salut,

    J'étais partie sur cette voix.

    Merci pour ta suggestion

  9. #9
    Membre averti Avatar de nekcorp
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2006
    Messages
    592
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2006
    Messages : 592
    Points : 383
    Points
    383
    Par défaut
    Citation Envoyé par tyrtamos Voir le message
    Bonjour,

    Et comme ça?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    L = [1,0,3,9,5,2,5,7,8,4,3,5]
    print([indice for indice, valeur in enumerate(L) if valeur==5])
    [4, 6, 11]
    Salut Tyrtamos,

    Toujours l'art de condenser un max ce qui prendrait plusieurs lignes pour le commun des mortels

  10. #10
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 812
    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 : 3 812
    Points : 7 097
    Points
    7 097
    Par défaut
    Merci pour ta suggestion
    Je pense que sur une grande liste, yield doit sortir son épingle du jeu.
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

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

Discussions similaires

  1. [MySQL] Sélectionnez une valeur présente X fois dans une table
    Par fkoncept dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 18/01/2013, 12h03
  2. [XL-2003] Tester si une valeur réapparait plusieurs fois dans une cellule
    Par apnw7931 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 18/04/2011, 15h10
  3. [RegEx] Détection d'une chaine présente plusieurs fois par ligne
    Par Tchupacabra dans le forum Langage
    Réponses: 6
    Dernier message: 03/07/2009, 16h54
  4. Réponses: 17
    Dernier message: 16/03/2009, 09h21
  5. Réponses: 4
    Dernier message: 23/02/2009, 19h39

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