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 :

Valeurs communes à deux tableaux


Sujet :

Python

  1. #1
    Membre chevronné

    Profil pro
    Account Manager
    Inscrit en
    Décembre 2006
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Account Manager

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 301
    Points : 1 752
    Points
    1 752
    Par défaut Valeurs communes à deux tableaux
    Bonjour,
    existe-il un moyen "pythonesque" de savoir si deux tableaux ont des valeurs en commun ?

    Par exemple, j'ai tab_1 = [1, 2, 3] , tab_2 = [4, 5, 6] et tab_3 = [7, 2, 3, 11] . Je voudrais que le programme me dise que tab_1 et tab_2 n'ont pas de valeur en commun contrairement à tab_1 et tab_3.

    La méthode consistant à parcourir toutes les clés du tab_1 ne m'intéresse pas car je sais déjà le faire.

  2. #2
    Membre émérite
    Avatar de DelphiManiac
    Homme Profil pro
    Homme à tout faire
    Inscrit en
    Mars 2002
    Messages
    1 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Homme à tout faire
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 147
    Points : 2 533
    Points
    2 533
    Par défaut
    Quelque chose dans ce style te conviendrais ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #!/usr/bin/python
    # -*- coding: utf-8 -*-
     
    tab_1 = [1, 2, 3]
    tab_2 = [4, 5, 6]
    tab_3 = [7, 2, 3, 11]
     
    print set(tab_1).intersection(tab_2)
     
    print set(tab_1).intersection(tab_3)
    Si ce message vous a semblé utile, il est possible qu'il soit utile à d'autres personnes. Pensez au . Et n'oubliez pas le le moment venu !

    On n'a pas à choisir si l'on est pour ou contre la décroissance, elle est inéluctable, elle arrivera qu'on le veuille ou non.

  3. #3
    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
    Quelques propositions:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    >>> tab_1 = [1, 2, 3]
    >>> tab_2 = [4, 5, 6]
    >>> tab_3 = [7, 2, 3, 11] 
    >>> 
    >>> any(x in tab_2 for x in tab_1)
    False
    >>> any(x in tab_3 for x in tab_1)
    True
    >>> bool(set(tab_1) & set(tab_2))
    False
    >>> bool(set(tab_1) & set(tab_3))
    True

  4. #4
    Membre chevronné

    Profil pro
    Account Manager
    Inscrit en
    Décembre 2006
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Account Manager

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 301
    Points : 1 752
    Points
    1 752
    Par défaut
    Citation Envoyé par DelphiManiac Voir le message
    Quelque chose dans ce style te conviendrais ?
    Oui ta méthode est très "pythonesque"... Cela me plait bien.

    dividee, ton code est bien aussi (même si les deux premières méthodes parcourent les tableaux) mais celui de DelphiManiac a l'avantage de récupérer les valeurs communes (ce qui dans mon cas va m'être très utile).

    Merci beaucoup pour la célérité avec laquelle vous avez répondu.

  5. #5
    Membre émérite
    Avatar de DelphiManiac
    Homme Profil pro
    Homme à tout faire
    Inscrit en
    Mars 2002
    Messages
    1 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Homme à tout faire
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 147
    Points : 2 533
    Points
    2 533
    Par défaut
    Dans tout les cas, il faut pas se leurrer, toutes les méthodes parcourent les tableaux, soit c'est codé dans la librairie comme pour les set, soit c'est toi qui code, mais globalement ça revient au même

    Les 2 derniers exemples de dividee sont aussi avec des set, mais c'est juste la syntaxe qui change, pas le principe : (surcharge de l'opérateur & au lieu d'utiliser la méthode intersection)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #!/usr/bin/python
    # -*- coding: utf-8 -*-
     
    tab_1 = [1, 2, 3]
    tab_2 = [4, 5, 6]
    tab_3 = [7, 2, 3, 11]
     
    print set(tab_1) & set(tab_2)
     
    print set(tab_1) & set(tab_3)
    Voici l'équivalent des set avec des list comprehension :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    print [x for x in tab_1 if x in tab_2]
    print [x for x in tab_1 if x in tab_3]
    L'avantage des list comprehensions, c'est de pouvoir faire un traitement en même temps : (exemple la liste des carrés des valeurs communes)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    print [x*x for x in tab_1 if x in tab_2]
    print [x*x for x in tab_1 if x in tab_3]
    La somme de ces mêmes carrés :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    print sum([x*x for x in tab_1 if x in tab_2])
    print sum([x*x for x in tab_1 if x in tab_3])
    En gros tout dépend de ton besoin final
    Si ce message vous a semblé utile, il est possible qu'il soit utile à d'autres personnes. Pensez au . Et n'oubliez pas le le moment venu !

    On n'a pas à choisir si l'on est pour ou contre la décroissance, elle est inéluctable, elle arrivera qu'on le veuille ou non.

  6. #6
    Membre chevronné

    Profil pro
    Account Manager
    Inscrit en
    Décembre 2006
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Account Manager

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 301
    Points : 1 752
    Points
    1 752
    Par défaut
    Citation Envoyé par DelphiManiac Voir le message
    Dans tout les cas, il faut pas se leurrer, toutes les méthodes parcourent les tableaux
    Certes mais on peut imaginer une méthode qui s'arrête dès une occurence repérée (par exemple en utilisant des while) ce qui évite des boucles inutiles.

    Merci pour les précisions sur les list comprehension.

  7. #7
    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
    Petite correction de mon post précédent: la méthode avec any n'est pas correcte car si les listes contiennent des éléments communs mais que ceux-ci correspondent à un valeur booléenne False (par exemple 0, False, [],...) le résultat sera incorrect:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    >>> any(f(x) for x in [1,0,3] if x in [5,0,7])
    False
    La correction est simple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    >>> any(True for x in [1,0,3] if x in [5,0,7])
    True
    Certes mais on peut imaginer une méthode qui s'arrête dès une occurence repérée (par exemple en utilisant des while) ce qui évite des boucles inutiles.
    C'est ce que fait le code ci-dessus avec any. Ce n'est pas une compréhension de liste mais une "generator expression", et any n'évaluera que le premier élément retourné par ce générateur.

    Mais il faut savoir... A ton post précédent tu as dit qu'il te serait très utile de récupérer les valeurs communes; ce n'est pas compatible avec le fait de s'arrêter à la première correspondance.

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

Discussions similaires

  1. Mettre les valeurs de deux tableaux en relation deux a deux
    Par pascaloupsu dans le forum Langage
    Réponses: 3
    Dernier message: 24/06/2014, 14h52
  2. Comparer les valeurs de deux tableaux
    Par mailbox dans le forum Débuter
    Réponses: 12
    Dernier message: 28/11/2010, 19h14
  3. Comparer deux tableaux ou deux valeurs
    Par mat_ingrid dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 09/04/2009, 12h20
  4. Réponses: 4
    Dernier message: 23/04/2008, 17h03
  5. Réponses: 10
    Dernier message: 07/12/2006, 20h52

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