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 :

Recherche un doublon dans une liste [Python 3.X]


Sujet :

Python

  1. #1
    Membre éclairé
    Inscrit en
    Février 2009
    Messages
    633
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 633
    Par défaut Recherche un doublon dans une liste
    Bonjour,

    Je cherche à vérifier si une valeur numérique est en double dans une liste, mais ça ne fonctionne pas

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    valeur = 2
    list = [1,2,3]
    if (valeur in list[:]):
        print("La valeur", valeur, "est en double.")
    Si vous avez une solution simple,
    merci d'avance.

  2. #2
    Rédacteur/Modérateur

    Avatar de User
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    8 529
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 8 529
    Billets dans le blog
    67
    Par défaut
    Bonjour,

    Une liste dispose d'une méthode count() :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    ...
    valeur = 2
    c = list.count(valeur)
    if (c==2): # ou if (c>=2):
    ...
    Vous trouverez dans la FAQ, les sources ou les tutoriels, de l'information accessible au plus grand nombre, plein de bonnes choses à consulter sans modération

    Des tutoriels pour apprendre à créer des formulaires de planning dans vos applications Access :
    Gestion sur un planning des présences et des absences des employés
    Gestion des rendez-vous sur un calendrier mensuel


    Importer un fichier JSON dans une base de données Access :
    Import Fichier JSON

  3. #3
    Membre éclairé
    Inscrit en
    Février 2009
    Messages
    633
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 633
    Par défaut
    c'est parfait! merci

  4. #4
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 032
    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 032
    Par défaut
    Hello,

    Le problème avec ton code, c'est que l'instruction if (valeur in list[:]): vérifie uniquement si valeur est présent dans la liste, mais pas s'il est en double.

    Autre problème :

    1. Nom de variable list → Ne pas utiliser list comme nom de variable car c'est un mot réservé en Python.
    2. list[:] → Cette notation fait une copie de la liste, mais ne change rien à la logique.


    Pour le reste la solution de User est très bien !
    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
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 284
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2013
    Messages : 2 284
    Par défaut
    bonjour
    la solution de User est très bien
    J'ai plus de réserve : tout dépend de notre cours !
    Et vu la question (et le [:] en réponse), je pense que cette réponse n'est sans doute pas adaptée au niveau du demandeur.
    La réponse doit refléter la technique vue juste avant la question.

    Débutant: va utiliser ce qu'il connait, donc une "simple" boucle for (si cours est sur les boucles)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    valeur = 2
    list = [1, 2, 3, 2]
    count = 0
    for val in list:
        if val == valeur:
            count += 1
    if count > 1:
        print(valeur, "est présent:", count, "fois")
    intermédiaire : si question est posée après les "compréhensions de liste"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    count = len([x for x in list if x == valeur])
    if count > 1:
        print(valeur, "est présent:", count, "fois")
    ps: oui, list.count() est "the best"
    $moi= (:nono: !== :oops:) ? :king: : :triste: ;

  6. #6
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 032
    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 032
    Par défaut
    bonjour

    la solution de User est très bien


    J'ai plus de réserve : tout dépend de notre cours !
    Très bien, dans le sens elle fonctionne, je souhaitais pas forcément débattre sur le niveau de syntaxe pour ce type d'exercice, mais maintenant c'est fait !

    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)

  7. #7
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 801
    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 801
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par papajoker Voir le message
    count = len([x for x in list if x == valeur])
    Pas besoin de recréer une liste, len() s'applique très bien sur un générateur => count = len(x for x in list if x == valeur).
    Et même si ça semble anodin ça ne l'est en réalité pas du tout. Car un générateur travaille à l'économie (s'il trouve une certitude il s'arrête) alors que la liste sera générée même si c'est inutile.

    Exemple
    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
    >>> def f(n):
    ...     print(n)
    ...     return n == 5
    ... 
    >>> any(f(x) for x in range(10))
    0
    1
    2
    3
    4
    5
    True
    >>> any([f(x) for x in range(10)])
    0
    1
    2
    3
    4
    5
    6
    7
    8
    9
    True
    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 032
    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 032
    Par défaut
    Hello

    Les générateurs ne stockent pas leurs éléments, donc ils ne peuvent pas implémenter __len__(), ce qui entraîne une erreur.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    >>> valeur = 2
    >>> liste = [1, 2, 3, 2, 4, 2, 5]
    >>> count = len(x for x in liste if x == valeur)
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    TypeError: object of type 'generator' has no len()
    Rien dans la documentation indique l'implémentation de __len__ concernant les générateurs (le générateur est un itérateur paresseux)...

    Pour le générateur à mon sens la meilleure approche serait count = sum(1 for x in liste if x == valeur).


    Ça compte les éléments sans créer une liste intermédiaire.
    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)

  9. #9
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 801
    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 801
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par fred1599 Voir le message
    Les générateurs ne stockent pas leurs éléments, donc ils ne peuvent pas implémenter __len__(), ce qui entraîne une erreur.
    Mince en effet. Désolé je n'arrive pas à comprendre avec quoi j'ai pu confondre.
    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]

  10. #10
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 032
    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 032
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Mince en effet. Désolé je n'arrive pas à comprendre avec quoi j'ai pu confondre.
    Avec le tuple je pense...
    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)

  11. #11
    Membre Expert
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2003
    Messages
    1 602
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 1 602
    Par défaut
    Bonjour.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    liste = [1,1,1,2,3,4,2,4,3,2,1,1,1,1,1,5]
    print("valeurs en doublon : ", [x for x in set(liste) if liste.count(x) > 1])
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    valeurs en doublon :  [1, 2, 3, 4]

  12. #12
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 032
    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 032
    Par défaut
    Hello,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    from collections import Counter
     
     
     
    liste = [1, 1, 1, 2, 3, 4, 2, 4, 3, 2, 1, 1, 1, 1, 1, 5]
     
     
    compteur = Counter(liste)
    doublons = [item for item, count in compteur.items() if count > 1]
     
     
    print("Valeurs en doublon :", doublons)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    In [1]: 
       ...: from collections import Counter
       ...: 
       ...: liste = [1, 1, 1, 2, 3, 4, 2, 4, 3, 2, 1, 1, 1, 1, 1, 5]
       ...: 
       ...: compteur = Counter(liste)
       ...: doublons = [item for item, count in compteur.items() if count > 1]
       ...: 
     
     
    In [2]: doublons
    Out[2]: [1, 2, 3, 4]
    ou

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    In [1]: from collections import Counter
       ...: 
       ...: liste = [1, 1, 1, 2, 3, 4, 2, 4, 3, 2, 1, 1, 1, 1, 1, 5]
       ...: compteur = Counter(liste)
       ...: doublons = [x for x in compteur if compteur[x] > 1]
       ...: print("valeurs en doublon : ", doublons)
    valeurs en doublon :  [1, 2, 3, 4]
    ou

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    In [1]: liste = [1, 1, 1, 2, 3, 4, 2, 4, 3, 2, 1, 1, 1, 1, 1, 5]
       ...: seen = set()
       ...: doublons = set()
       ...: for x in liste:
       ...:     if x in seen:
       ...:         doublons.add(x)
       ...:     else:
       ...:         seen.add(x)
       ...: print("valeurs en doublon : ", list(doublons))
    valeurs en doublon :  [1, 2, 3, 4]
    En tout cas, toutes les solutions ci-dessus sont algorithmiquement meilleures, que la solution count
    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)

  13. #13
    Membre Expert
    Avatar de MPython Alaplancha
    Homme Profil pro
    Paysan à 3 francs six sous
    Inscrit en
    Juin 2018
    Messages
    914
    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 : 914
    Billets dans le blog
    7
    Par défaut
    Bonjour.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    >>> liste = [1, 1, 1, 2, 3, 4, 2, 4, 3, 2, 1, 5, 6, 7, 9, 9]
    >>> doublons = set()
    >>> for i in range(len(liste)):
    ...     if liste[i] in liste[i+1:]:
    ...             doublons.add(liste[i])
    ... 
    >>> doublons
    {1, 2, 3, 4, 9}
    #Rien de nouveau sous le soleil, tout est vanité comme courir après le vent!
    Envie de développer pour Android avec Python? Pensez à Kivy
    Kivy c'est aussi ça: https://www.youtube.com/@MPython_Alaplancha

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

Discussions similaires

  1. Réponses: 7
    Dernier message: 27/01/2018, 17h19
  2. [C# 2.0] Détecter les doublons dans une List<string>
    Par Rodie dans le forum Windows Forms
    Réponses: 36
    Dernier message: 30/03/2013, 15h21
  3. [XL-2007] Recherche de doublon dans une liste
    Par Invité dans le forum Macros et VBA Excel
    Réponses: 19
    Dernier message: 26/07/2012, 18h49
  4. [Oracle] Doublon dans une liste
    Par shaun_the_sheep dans le forum Oracle
    Réponses: 9
    Dernier message: 09/06/2006, 16h09
  5. Réponses: 5
    Dernier message: 21/11/2005, 14h24

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