OVH Cloud OVH Cloud

Accès à une liste triée de doublet

37 réponses
Avatar
Dominique Crétel
Bonjour,

Je débute en Python.
J'ai la liste _triée_ complexe suivante :

lite = ['222', 'bbb', '111', 'aaa', '333', 'ccc', '21456', 'fdfd']
etc.

cela aurait pu être un dictionnaire, mais l'ordre ci-dessus est important.

le nombre d'éléments est bien pair.

il existe un lien entre le 1er élément et le 2ème, le 3ème et le 4ème,
etc...

comment facilement au moyen d'un for balayer la liste ?

j'ai trouvé cela, mais est-ce bien pythonien ?

-----
def do_some_work(k, v):
print k, " => ", v

i = 0
for x in liste:
if (i %% 2 == 0):
k = x
else:
v = x
do_some_work(k, v)
i = i + 1
-----

Merci

10 réponses

1 2 3 4
Avatar
Christophe
Bonjour,

Je débute en Python.
J'ai la liste _triée_ complexe suivante :

lite = ['222', 'bbb', '111', 'aaa', '333', 'ccc', '21456', 'fdfd']
etc.

cela aurait pu être un dictionnaire, mais l'ordre ci-dessus est important.

le nombre d'éléments est bien pair.

il existe un lien entre le 1er élément et le 2ème, le 3ème et le 4ème,
etc...

comment facilement au moyen d'un for balayer la liste ?

j'ai trouvé cela, mais est-ce bien pythonien ?

-----
def do_some_work(k, v):
print k, " => ", v

i = 0
for x in liste:
if (i %% 2 == 0):
k = x
else:
v = x
do_some_work(k, v)
i = i + 1
-----

Merci


En voici une methode beaucoup plus facile à ecrire :)

i = iter(liste)
for elem in zip(i,i): print elem

Avatar
Dominique Crétel
Bonjour,

Je débute en Python.
J'ai la liste _triée_ complexe suivante :

lite = ['222', 'bbb', '111', 'aaa', '333', 'ccc', '21456', 'fdfd']
etc.

cela aurait pu être un dictionnaire, mais l'ordre ci-dessus est
important.

le nombre d'éléments est bien pair.

il existe un lien entre le 1er élément et le 2ème, le 3ème et le 4ème,
etc...

comment facilement au moyen d'un for balayer la liste ?

j'ai trouvé cela, mais est-ce bien pythonien ?

-----
def do_some_work(k, v):
print k, " => ", v

i = 0
for x in liste:
if (i %% 2 == 0):
k = x
else:
v = x
do_some_work(k, v)
i = i + 1
-----

Merci


En voici une methode beaucoup plus facile à ecrire :)

i = iter(liste)
for elem in zip(i,i): print elem


oui, en effet
et comment tu utiliser la fonction do_some_work(k, d) ?


Avatar
Christophe
def do_some_work(k, v):
print k, " => ", v

i = 0
for x in liste:
if (i %% 2 == 0):
k = x
else:
v = x
do_some_work(k, v)
i = i + 1
-----

Merci



En voici une methode beaucoup plus facile à ecrire :)

i = iter(liste)
for elem in zip(i,i): print elem



oui, en effet
et comment tu utiliser la fonction do_some_work(k, d) ?


Plein de possibilités :

for k,v in zip(i,i): do_some_work(k, v)
###
for elem in zip(i,i): do_some_work(*elem)

Et en changeant la definition de do_some_work :

def do_some_work((k, v)):
print k, " => ", v
for elem in zip(i,i): do_some_work(elem)
###
def do_some_work(elem):
k, v = elem
print k, " => ", v
for elem in zip(i,i): do_some_work(elem)
###
def do_some_work(elem):
print elem[0], " => ", elem[1]
for elem in zip(i,i): do_some_work(elem)
###
def do_some_work(elem):
print "%d => %d" % elem
for elem in zip(i,i): do_some_work(elem)

etc, etc, etc :)



Avatar
R12y
bruno at modulix :

while liste:
print "%s : %s" % (liste.pop(0), liste.pop(0))


Pas mieux :-)

--

http://www.onirik.net/article.php3?id_article7
http://www.maemo.org/platform/docs/howtos/howto_new_application.html
http://www.linuxdevices.com/files/article057/index.html

Avatar
Christophe
Christophe wrote:

En voici une methode beaucoup plus facile à ecrire :)

i = iter(liste)
for elem in zip(i,i): print elem



Mais illisible !! Il m'a falu un certain temps pour piger le
fonctionnement...

Sur deux lignes c'est ok, mais quand on retrouve cela dans un code de
1500 lignes, personellement je me jete par la fenetre :)



Bof, c'est un pattern à connaitre c'est tout ;)


Avatar
Guillaume Bouchard
Christophe wrote:
En voici une methode beaucoup plus facile à ecrire :)

i = iter(liste)
for elem in zip(i,i): print elem


Mais illisible !! Il m'a falu un certain temps pour piger le
fonctionnement...

Sur deux lignes c'est ok, mais quand on retrouve cela dans un code de
1500 lignes, personellement je me jete par la fenetre :)

--
Guillaume.

Avatar
Guillaume Bouchard
Christophe wrote:
Bof, c'est un pattern à connaitre c'est tout ;)


Python m'a seduit car sans connaitre le language, on comprend ce que
l'on lit. Ce genre de "Pattern" à connaitre, c'est louche :)

--
Guillaume.

Avatar
Guillaume Bouchard
R12y wrote:
d[l.pop()]=l.pop()
Quel l.pop() est effectué en premier? celui de gauche ou de droite?


Suffit de tester.

a = ['premier','second']
d = {}
d[a.pop()] = a.pop()
d
{'premier': 'second'}




Ce qui en soit semble logique.

Maitenant je doute de la bonne idee de ce mecanisme...

--
Guillaume.



Avatar
Christophe Cavalaria
Guillaume Bouchard wrote:

R12y wrote:
d[l.pop()]=l.pop()
Quel l.pop() est effectué en premier? celui de gauche ou de droite?


Suffit de tester.

a = ['premier','second']
d = {}
d[a.pop()] = a.pop()
d
{'premier': 'second'}




Ce qui en soit semble logique.

Maitenant je doute de la bonne idee de ce mecanisme...

Franchement, je prefere encore ma version ! Au moins, il y a un comportement

previsible ( il me semble que zip certifie que les iterateurs seront
utilises sequentiellement ) alors que dans ce cas, rien ne le garantit.




Avatar
tiissa
Christophe wrote:
En voici une methode beaucoup plus facile à ecrire :)

i = iter(liste)
for elem in zip(i,i): print elem


Plus facile mais sans garantie. zip ne spécifie pas dans quel ordre il
accède aux listes et à leurs éléments mais ta boucle repose dessus.
Par exemple rien n'empêcherait zip de dévider toute la première liste
avant de s'attaquer aux suivantes (rien, sauf la simplicité de
l'implémentation).

Personnellement, je déconseillerais cette méthode, au profit de
l'itérateur de Laurent ou de la solution de Jean-Sébastien.


Pour ne pas être le seul à ne rien proposer, voilà une solution avec
groupby :

liste = ['a', 1, 'b', 2, 'c', 3]
from itertools import groupby
for _, (k, v) in groupby(enumerate(liste), lambda (i, x) : i/2):
... print k[1], '=>', v[1]



...
a => 1
b => 2
c => 3







1 2 3 4