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
Dominique Crétel
Dominique Crétel :

Excuses-moi mais là ne ne comprends pas !
Peux-tu me donner un exemple ?


d={}
l = ['222', 'bbb', '111', 'aaa', '333', 'ccc', '21456', 'fdfd']
l.reverse()
for i in range(len(l)/2):
cle=l.pop()
valeur=l.pop()
d[cle]=valeur



merci, je comprends beaucoup mieux.
c'est assez bizarre comme méthode, mais elle fonctionne.


Avatar
R12y
Dominique Crétel :

c'est assez bizarre comme méthode, mais elle fonctionne.


Maintenant c'est à toi de m'expliquer en quoi c'est "bizare" :-)

--

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
Dominique Crétel
Dominique Crétel :

c'est assez bizarre comme méthode, mais elle fonctionne.


Maintenant c'est à toi de m'expliquer en quoi c'est "bizare" :-)



je comprends cette méthode mais je trouve ça bizarre (ou plutot non
intuitif) dans le sens où il faut :

- inverser la liste
- ne parcourir la moitié de la liste dans le for
- accéder au reste de la liste au moyen de pop()

mais le tout est logique !


Avatar
R12y
Dominique Crétel :
je comprends cette méthode mais je trouve ça bizarre (ou plutot non
intuitif) dans le sens où il faut :
- inverser la liste


ça c'est parceque pop() prend par la fin.
si pop prenait du début, ça n'aurait pas été necessaire.

- ne parcourir la moitié de la liste dans le for


Parceque tu prends les éléments deux par deux.

- accéder au reste de la liste au moyen de pop()


Ce n'est pas un "simple" accès, puisque en même temps, tu "vide" la liste.
Si la liste est énorme, peut-être que au fur et à mesure du traitement tu
réduit la taille occupée par cette liste.

--

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
Guillaume Bouchard
Dominique Crétel wrote:
for k, v in zip(lite[::2], lite[1::2]):
print k, "=>", v

je ne sais pas si c'est optimal, mais c'est concis :)



C'est beau, mais je fais partit des gens qui n'aime pas quand la
concision donne quelque chose de non lisible :)

C'est quoi cette commande zip ?


print zip.__doc__
zip(seq1 [, seq2 [...]]) -> [(seq1[0], seq2[0] ...), (...)]




Return a list of tuples, where each tuple contains the i-th element
from each of the argument sequences. The returned list is truncated
in length to the length of the shortest argument sequence.

enclair zip((1,2,3),(4,5,6)) --> ((1,4),(2,5),(3,6))

Et je ne connais pas la syntaxe des slices avec 2 ':' ???
(je ne connais que celle avec 1 ':')


[bornedebut:bornefin:increment]

Touts les elements de l'index debut à l'index fin (non compris) en
passant par (la loraine ?) ceux du milieu tous les increment


(1,2,3,4,5,6,7,8,9)[::2] -->1,3,5,7,9

--
Guillaume.



Avatar
R12y
R12y :
Dominique Crétel :
je comprends cette méthode mais je trouve ça bizarre (ou plutot non
intuitif) dans le sens où il faut :
- inverser la liste
ça c'est parceque pop() prend par la fin.

si pop prenait du début, ça n'aurait pas été necessaire.


En faisant pop(0) tu peux enlever l'inversion car tu lui dit de prendre le
premier élément de la liste. J'avais pas trouvé/lu la doc avant maintenant.

--

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
bruno at modulix
Dominique Crétel wrote:
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.


Je suppose donc que tu a la main sur la création de cette liste...

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 ?


AMHA, la "bonne" structure de données serait:
liste = [('222', 'bbb'),
('111', 'aaa'),
('333', 'ccc'),
('21456', 'fdfd')]

Après quoi le parcours devient plus que stupide:

for paire in liste:
do_some_work(*paire)

mes deux centimes...

--
bruno desthuilliers
python -c "print '@'.join(['.'.join([w[::-1] for w in p.split('.')]) for
p in ''.split('@')])"

Avatar
bruno at modulix
R12y wrote:
Dominique Crétel :

je comprends cette méthode mais je trouve ça bizarre (ou plutot non
intuitif)



Et inutilement compliqué !-)

dans le sens où il faut :
- inverser la liste



ça c'est parceque pop() prend par la fin.
help([].pop)
Help on built-in function pop:




pop(...)
L.pop([index]) -> item -- remove and return item at index (default last)

l = ['a', 0, 'b', 1, 'c', 2]
l
['a', 0, 'b', 1, 'c', 2]



l.pop(0)
'a'



l
[0, 'b', 1, 'c', 2]







si pop prenait du début, ça n'aurait pas été necessaire.


Ce n'est donc pas nécessaire !-)


- ne parcourir la moitié de la liste dans le for



Parceque tu prends les éléments deux par deux.

- accéder au reste de la liste au moyen de pop()


Ce n'est pas un "simple" accès, puisque en même temps, tu "vide" la liste.


Puique list.pop() vide la liste, un while suffit...

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


--
bruno desthuilliers
python -c "print '@'.join(['.'.join([w[::-1] for w in p.split('.')]) for
p in ''.split('@')])"



Avatar
bruno at modulix
Dominique Crétel wrote:
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.


cf mon autre réponse sur le choix de la structure de données.

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 ?


Au moyen d'un while, ça te va ?-)

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


Non.

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


# assert len(liste) % 2 == 0, "oops, liste is not pair"
while liste:
do_some_work(liste.pop(0), liste.pop(0))

NB : Si tu a besoin de la liste pour d'autres traitements, il faut en
faire une copie. Ce qui n'est pas forcément optimal si ta liste est
longue. D'où l'intérêt de favoriser une bonne structure de données si
possible (cf post précédent)

Merci


HTH

--
bruno desthuilliers
python -c "print '@'.join(['.'.join([w[::-1] for w in p.split('.')]) for
p in ''.split('@')])"

Avatar
Laurent Pointal
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


Avec un générateur, comme ça:

def coupleur(l) :
iter_l = iter(l)
while True :
k = iter_l.next()
v = iter_l.next()
yield (k,v)

Ensuite:

lite = ['222', 'bbb', '111', 'aaa', '333', 'ccc', '21456', 'fdfd']
cpl = coupleur(lite)
for k,v in cpl: do_some_work(k,v)

1 2 3 4