Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2743 connectés 

  FORUM HardWare.fr
  Programmation
  Python

  [RESOLU] Traiter un tableau 2 par 2

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[RESOLU] Traiter un tableau 2 par 2

n°1739598
Sve@r
Posté le 31-05-2008 à 08:36:35  profilanswer
 

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.
mood
Publicité
Posté le 31-05-2008 à 08:36:35  profilanswer
 

n°1739713
KangOl
Profil : pointeur
Posté le 31-05-2008 à 17:25:00  profilanswer
 

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

n°1739765
Sve@r
Posté le 31-05-2008 à 21:40:57  profilanswer
 

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.
n°1739796
KangOl
Profil : pointeur
Posté le 01-06-2008 à 00:22:45  profilanswer
 

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')

n°1739852
Sve@r
Posté le 01-06-2008 à 13:10:27  profilanswer
 

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.
n°1739907
masklinn
í dag viðrar vel til loftárása
Posté le 01-06-2008 à 17:53:12  profilanswer
 

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
n°1739909
KangOl
Profil : pointeur
Posté le 01-06-2008 à 18:00:13  profilanswer
 

merci pour l'info...

n°1739932
masklinn
í dag viðrar vel til loftárása
Posté le 01-06-2008 à 20:34:51  profilanswer
 

?


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

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Python

  [RESOLU] Traiter un tableau 2 par 2

 

Sujets relatifs
Tableau avec année dynamique[Résolu] Fil d'Ariane PHP/MySQL sur système d'include
[Résolu] Newbie - requêtes SQL de sélection et boucle[C++ et C] Lister les interfaces réseau d'un PC [resolu]
[C#.NET][pas si resolu] Colorer un ou plusieurs mots dans une textboxRequête sur opération select max
session ne marchent pas...(résolu)[RESOLU]Traduire du C++ en PHP
[JAVA] [Résolu] Variable Calendar incrémentée dans une boucle 
Plus de sujets relatifs à : [RESOLU] Traiter un tableau 2 par 2


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR