[RESOLU] Traiter un tableau 2 par 2

Traiter un tableau 2 par 2 [RESOLU] - Python - Programmation

Marsh Posté le 31-05-2008 à 08:36:35    

Bonjour bonjour
 
J'ai besoin de traiter un tableau 2 par 2. J'ai donc imaginé l'algo suivant

Code :
  1. tab="azerty"
  2. for c in tab:
  3.     i=(tab.index(c) + 1) % len(tab)
  4.     <traitement de c et de tab[i]>


 
Bon, ça marche mais je me demandais s'il n'y avait pas un moyen plus élégant de faire ça...
 
Autre question: sur un dictionnaire, est-on assuré que les éléments se trouvent dans l'ordre dans lequel ils ont été insérés ???


Message édité par Sve@r le 01-06-2008 à 13:10:55

---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 31-05-2008 à 08:36:35   

Reply

Marsh Posté le 31-05-2008 à 17:25:00    

un truc du genre ?
 

Code :
  1. class with_index(object):
  2.     def __init__(self, iterable_object):
  3.         self.obj = iterable_object
  4.  
  5.     def __getitem__(self, index):
  6.         return (index, self.obj[index])
  7.  
  8.  
  9.  
  10. if __name__ == '__main__':
  11.     def run(x):
  12.         for i, o in with_index(x):
  13.             print "%d -> %s" % (i, repr(o))
  14.  
  15.  
  16.     run(['a', 'b', 'c'])
  17.     run((1, 2, 3))
  18.     run('foobar')


 
concernant l'autre question, non, les dictionnaires ne sont pas ordonnés

Reply

Marsh Posté le 31-05-2008 à 21:40:57    

KangOl a écrit :

un truc du genre ?
 

Code :
  1. class with_index(object):
  2.     def __init__(self, iterable_object):
  3.         self.obj = iterable_object
  4.  
  5.     def __getitem__(self, index):
  6.         return (index, self.obj[index])
  7.  
  8.  
  9.  
  10. if __name__ == '__main__':
  11.     def run(x):
  12.         for i, o in with_index(x):
  13.             print "%d -> %s" % (i, repr(o))
  14.  
  15.  
  16.     run(['a', 'b', 'c'])
  17.     run((1, 2, 3))
  18.     run('foobar')



C'est sympa d'avoir répondu si vite mais t'as pas bien compris mon problème...
Ton objet (que je trouve très sympa) renvoie l'index de l'élément et l'élément lui-même. Bon c'est aussi un truc à garder dans un coin mais mon besoin est différent
Moi, j'ai besoin d'un truc qui, si je lui passe "azerty", me renvoie
a, z
z, e
e, r
r, t
t, y
y, a
Mais bon, comme je l'ai dit au début, mon algo le fait. Sauf que je le trouve lourd (récupérer l'index "i" de l'élément en cours pour accéder à l'élément [i+1])...
 

KangOl a écrit :

concernant l'autre question, non, les dictionnaires ne sont pas ordonnés


Ok merci. Ca m'embête un peu mais bon, me suffit de rajouter dans mon dico l'ordre de création et faire un tri sur ce critère et pis basta.


---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 01-06-2008 à 00:22:45    

bha avec mon objet, tu fait juste un i+1 pour récupérer l'element suivant
 
tu peux aussi te baser sur mon idée et tu obtiens ceci

Code :
  1. class by_two(object):
  2.     def __init__(self, iterable_object):
  3.         self.obj = iterable_object
  4.     
  5.     def __getitem__(self, index):
  6.         index2 = (index <> len(self.obj)-1) and (index + 1) or 0
  7.         return (self.obj[index], self.obj[index2])
  8.  
  9.  
  10. if __name__ == '__main__':
  11.     def run(x):
  12.         for o, p in by_two(x):
  13.             print "%s - %s" % (repr(o), repr(p))
  14.  
  15.  
  16.     run(['a', 'b', 'c'])
  17.     run((1, 2, 3))
  18.     run('foobar')

Reply

Marsh Posté le 01-06-2008 à 13:10:27    

KangOl a écrit :

bha avec mon objet, tu fait juste un i+1 pour récupérer l'element suivant
 
tu peux aussi te baser sur mon idée et tu obtiens ceci

Code :
  1. class by_two(object):
  2.     def __init__(self, iterable_object):
  3.         self.obj = iterable_object
  4.     
  5.     def __getitem__(self, index):
  6.         index2 = (index <> len(self.obj)-1) and (index + 1) or 0
  7.         return (self.obj[index], self.obj[index2])
  8.  
  9.  
  10. if __name__ == '__main__':
  11.     def run(x):
  12.         for o, p in by_two(x):
  13.             print "%s - %s" % (repr(o), repr(p))
  14.  
  15.  
  16.     run(['a', 'b', 'c'])
  17.     run((1, 2, 3))
  18.     run('foobar')



 
C'est géant. Tu redéfinis l'opérateur [n] pour qu'il renvoie l'élément [n] et [n + 1]. Trop simple quand on maîtrise !!!  :bounce:  
 
Merci  :hello:  


---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 01-06-2008 à 17:53:12    

Sinon, il est possible de faire ça en utilisant itertools.cycle & zip:

 
Code :
  1. # hop
  2.  
  3.    >>> from itertools import cycle
  4.    >>> items = "azerty"
  5.  
  6.    >>> def cycle1(iterable):
  7.    ...     c = cycle(iterable)
  8.    ...     c.next()
  9.    ...     return c
  10.  
  11.    >>> zip(items, cycle1(items))
  12.    [('a', 'z'), ('z', 'e'), ('e', 'r'), ('r', 't'), ('t', 'y'), ('y', 'a')]
  13.  
  14.    >>> for i, j in zip(items, cycle1(items)):
  15.    ...     print "%s - %s"%(i, j)
  16.    a - z
  17.    z - e
  18.    e - r
  19.    r - t
  20.    t - y
  21.    y - a


(c'est un script doctest valide normalement)


Message édité par masklinn le 01-06-2008 à 17:54:13

---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 01-06-2008 à 18:00:13    

merci pour l'info...

Reply

Marsh Posté le 01-06-2008 à 20:34:51    

?


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed