Vous êtes ici : Accueil / Forums & ML / Forums Python / Forum général Python / retirer les entité d'une liste n'étant pas présente dans une autre

retirer les entité d'une liste n'étant pas présente dans une autre

Remonter à Forum général Python
  • retirer les entité d'une liste n'étant pas présente dans une autre

    Envoyé par Epeios le 9 Décembre 2010 à 07:53
    bjr,

    j'ai deux tables :

    aa : id,nom,date
    et
    bb : id,aa_id,obs

    j'ai une liste de aa et je veux en retirer les lignes quand il n'y a aucun bb lié a un aa.

    exemple :

    aa = 123,truc,2010-10-10

    si il n'y a aucune ligne bb contenant aa_id=123 alors je retire de ma liste le aa 123

    j'ai besoin de savoir les XXXX dans la fonction :
    aa_list = aa_list.filter(XXXX)

    merci d'avance.
    • Re: retirer les entité d'une liste n'étant pas présente dans une autre

      Envoyé par Epeios le 15 Décembre 2010 à 08:24
      bjr,
      et merci pour l'aide.

      c'est effectivement un postgresql qui est derrière.
      de plus le programme utilise django.

      voila la parti d emon code correspondante :

      def tournee_archives(request, queryset, extra_context=None):
      tableau = request.GET
      recherche_secteur = int(tableau.get('secteur', '0'))
      tournee_vide = tableau.get('tourneevide')

      liste_des_tournees = queryset

      if recherche_secteur!=0 :
      liste_des_tournees = liste_des_tournees.filter(secteur=recherche_secteur)



      la j'ai besoin de retirer du tableau liste_des_tournees toutes les tournees qui n'ont pas de visites (quand tournee_vide = on)

      sachant que :
      TOURNEES ---(0,n)---------(0,1)---VISITES

      c a dire que les tournees ont un ID et dans la table visite il y a une case : tournee_id (qui peut etre vide).

      donc la j'ai une liste de tournee (liste_des_tournees) parmi l'ensemble des tournees. et je veux savoir pour chacune d'entre elle si aucune visite ne pointe sur elle.

      je suppose que le début de ce que je recherche est :

      if tournee_vide=='on' : liste_des_tournees = liste_des_tournees.filter(?????)

      je ne maitrise pas la jointure mais il doit y avoir un truc du genre "visite__tournee"

      mais peut être que cette requete est plus complexe est qu'il faut effectivement que je passe par une boucle for.

      pour résumer les 2 tables :
      tournee (id,nom ....)
      visite (id,nom, ... ,tournee_id)

      et mon besoin
      j'ai une liste de tournee.
      je veux retirer toutes celle qui ne sont jamais cité dans la case tournee_id de la table visite.

      merci.
      cordialement.

    • Re: retirer les entité d'une liste n'étant pas présente dans une autre

      Envoyé par YannickSol le 19 Décembre 2010 à 19:41
      Une solution avec le module itertools:

      #!/usr/bin/env python
      # -*- coding: utf-8 -*-
      #
      ...
      import itertools

      tournees = [ (5, 'Paris', 'info...'), (84, 'Lyon', 'info...'), (55, 'Angers', 'info...')
      ,(41, 'Amiens', 'info...'), (62, 'Nice', 'info...'), (7, 'Caen', 'info...') ]

      visites = [ (22, 'Amiens', 41), (7, 'Lyon', 84), (45, 'Nice', 62), (5, 'Toulouse', 'info...') ]

      visites_tournee = [ tournee_id for visite_id, lieu, tournee_id in visites ]

      def est_visitees(voyage):
      ... tournee_id, lieu, info = voyage
      ... if tournee_id in visites_tournee:
      ... ...return True
      ... else:
      ... ...return False

      def main():

      new_tournees = [ tournee for tournee in itertools.ifilter(est_visitees,tournees) ]"

      print 'les visites en tournée: '.decode('iso-8859-1'), new_tournees

      return 0

      if __name__ == '__main__':
      main()


      Résultat:
      les visites en tournée: [ (84, 'Lyon', 'info...'), (41, 'Amiens', 'info...'), (62, 'Nice', 'info...') ]

    • Re: retirer les entité d'une liste n'étant pas présente dans une autre

      Envoyé par eyquem le 12 Décembre 2010 à 13:55
      Salut,



      1) Pour répondre à ceci:

      j'ai besoin de savoir les XXXX dans la fonction :
      aa_list = aa_list.filter(XXXX)


      from time import clock

      aa_list = [(72,'truc','2010-10-10'),(54,'mach','2010-10-13'),
      (60,'blou','2010-10-23'),(53,'ghut','2010-08-06'),
      (68,'jiki','2010-03-31'),(62,'dery','2007-12-04'),
      (58,'wuhu','2007-03-22'),(66,'tyre','2008-36-09')]

      bb = [(48,203,'gwi'),(29,60,'ghy'),(23,54,'ghp'),(10,66,'gfr'),
      (11,128,'gvc'),(76,62,'gjk'),(33,700,'gaq')]


      print '\nfilter(lambda x: x[0] in [ y[1] for y in bb ] , aa_list)'
      te = clock()
      lu2 = filter(lambda x: x[0] in [ y[1] for y in bb ] , aa_list)
      print clock()-te


      Dix fois plus rapides:

      auxi = [ y[1] for y in bb ]
      print '\nfilter(lambda x: x[0] in auxi , aa_list)'
      te=clock()
      lu4 = filter(lambda x: x[0] in auxi , aa_list)
      print clock()-te


      et

      def f(x, ly = [ y[1] for y in bb ]):
      return x[0] in ly

      print '\nfilter , fonction'
      te = clock()
      lu5 = filter(f,aa_list)
      print clock()-te





      penser aussi que

      [em]Note that filter(function, iterable) is equivalent to [ item for item in iterable if function(item) ] if function is not None and [ item for item in iterable if item ] if function is None.[/em]

      doc Python

      C’est à dire qu’au lieu de filter() on peut utiliser une list comprehension.

      print 'list comprehension  ,  [y[1] for y in bb ]'
      te = clock()
      lu1 = [ x for x in aa_list if x[0] in [y[1] for y in bb ] ]
      print clock()-te
      #print lu1


      même temps d’exécution que premier code.




      Et en dix fois plus rapide:

      auxi = [ y[1] for y in bb ]
      print '\nlist comprehension , auxi'
      te = clock()
      lu3 = [ x for x in aa_list if x[0] in auxi ]
      print clock()-te





      Comme tu parles de tables, il doit s’agir de base de données. Je ne sais pas à quoi correspondent dans cette base [ y[1] for y in bb ] ou auxi, à toi de te débrouiller. Le temps d’exécution va en dépendre.

      Soit dit en passant, en parlant de tables, est-ce parce qu’il s’agit d’un SGBD d’un modèle déductif ?
      http://www.commentcamarche.net/contents/bdd/bddtypes.php3




      2) Et pour répondre à ceci:

      retirer les entité d'une liste n'étant pas présente dans une autre

      from time import clock

      aa_list = [(72,'truc','2010-10-10'),(54,'mach','2010-10-13'),
      (60,'blou','2010-10-23'),(53,'ghut','2010-08-06'),
      (68,'jiki','2010-03-31'),(62,'dery','2007-12-04'),
      (58,'wuhu','2007-03-22'),(66,'tyre','2008-36-09')]

      bb = [(48,203,'gwi'),(29,60,'ghy'),(23,54,'ghp'),(10,66,'gfr'),
      (11,128,'gvc'),(76,62,'gjk'),(33,700,'gaq')]


      lu6 = aa_list[:]
      print '\nfor i in xrange(len(aa_list)-1,-1,-1) , [ y[1] for y in bb ]'
      te = clock()
      for i in xrange(len(lu6)-1,-1,-1):
      if lu6[i][0] not in [ y[1] for y in bb ]:
      del lu6[i]
      print clock()-te




      Et dix fois plus rapides:


      auxi = [ y[1] for y in bb ]

      lu8 = aa_list[:]
      print 'for i,el in enumerate(lu8[::-1]) , auxi'
      te = clock()
      L = len(lu8)-1
      for i,el in enumerate(lu8[::-1]):
      if el[0] not in auxi:
      del lu8[L-i]
      print clock()-te



      lu7 = aa_list[:]
      print '\nfor i in xrange(len(aa_list)-1,-1,-1) , auxi'
      te = clock()
      for i in xrange(len(lu7)-1,-1,-1):
      if lu7[i][0] not in auxi:
      del lu7[i]
      print clock()-te




      C'est à dire que retirer des éléments d’une liste sans en créer une autre est une procédure différente de créer une nouvelle liste à partir d’une autre en sélectionnant les éléments retenus.


Rendu par Ploneboard