Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 24/07/2012, à 13:55

PengouinPdt

[Python] compréhension de ... list comprehension :p

Bonjour,

Sachant que j'ai un premier dictionnaire :

		array = {
			'active': [True, True, False],
			'name': ['xyz', 'vwz', 'abc'],
		}

Soit, le code suivant, qui a pour propos de réécrire le premier dictionnaire en supprimant les index correspondant à False :

		a = dict()
		a['active'] = a['name'] = list()
		for(index, item) in enumerate(array['active']):
			#print index, item
			if not array['active'][index]:
				array['name'].remove(array['name'][index])
				array['active'].remove(item)

		return array

qui peut apparemment être réécrit en tant que 'list comprehension', ainsi :

		array['active'] = [ item for (index, item) in enumerate(array['active']) if array['active'][index] ]
		array['name'] = [ array['name'][index] for (index, item) in enumerate(array['active']) if array['active'][index] ]
		return array

Qui peut être remplacé par :

array['active'], array['name'] = [ item for (index, item) in enumerate(array['active']) if array['active'][index] ], [ array['name'][index] for (index, item) in enumerate(array['active']) if array['active'][index] ]
return array

Donc, j'ai plus ou moins saisi comment transformé le code iteratif en list comprehension...

Maintenant, j'aimerai arriver à tout réunir dans la déclaration d'une seule list comprehension ; bien sûr, je n'y arrive pas...
Mais, est-ce possible ?

Du style :

array['active'], array['name'] = [ first_declarate, second_declarate for (index, item) in enumerate(array['active']) if array['active'][index] ]
return array

Ego ~
YUP.py :: Yet Uploader Pixxie.py :: script python : post d'images sur forum !

Hors ligne

#2 Le 24/07/2012, à 15:07

Jules Petibidon

Re : [Python] compréhension de ... list comprehension :p

PengouinPdt a écrit :

Bonjour,

Sachant que j'ai un premier dictionnaire :

		array = {
			'active': [True, True, False],
			'name': ['xyz', 'vwz', 'abc'],
		}

Sachant qu'à partir de là, tu t'es tiré une balle dans le pied.

A moins de ne VRAIMENT (souligné 3 fois) pas avoir le choix, il serait beaucoup plus avisé de créer quelque chose qui ressemble à ceci

array = [
    {'name': 'abc', 'active': True},
    ...]

Qui sera beaucoup plus facile à gérer, quelque soit le traitement que tu vas faire dessus.

Dernière modification par Jules Petibidon (Le 24/07/2012, à 15:08)

Hors ligne

#3 Le 24/07/2012, à 16:50

AnsuzPeorth

Re : [Python] compréhension de ... list comprehension :p

J'ajouterai, je ne sais plus ou j'ai lu ça, mais un programmeur pro disait qu'il préférait passer pour un 'non-expert' d'un langage plutot que de pondre du code incompréhensible ... En parlant justement des list-comprehension, si elle ne se dechiffre pas en 2 s, il est préférable de faire une boucle basique, plus facile à déchiffrer pour ceux qui lisent ton code, et surtout plus simple qd tu y retournera dans 6 mois ... Si tu dois te gratter la tête pendant 5 mn devant chaque liste, c'est pas le but de python.
J'aime bien cette philosophie, restons simple et clair, même si ca fait qqles lignes de code en plus...


Interface graphique pour bash, python ou autre: glade2script
Support Tchat: http://chat.jabberfr.org/muckl_int/inde … ade2script  (Hors ligne)

Hors ligne

#4 Le 24/07/2012, à 17:08

PengouinPdt

Re : [Python] compréhension de ... list comprehension :p

@julespetitbidon: Bien sûr que si, j'ai le choix. big_smile
Je vais tester, ça... Et, si ça me va, modifier mon code en conséquence.
Bon, ta logique n'est pas mienne.
La présentation est assurément plus clair, le traitement l'est moins.

@AnsuzPeorth: Et, il a bien raison. Personnellement, étant donné que j'essaye de comprendre ces fichus list comprehension ... je me posais vraiment la question s'il était possible de faire plus concis... Même si c'est plus pythonesque, faut avouer que c'est une logique à part, cette forme de construction de développement. Je découvre le python depuis quelques jours, donc je fais mumuse, ni plus ni moins
Et ce n'est pas moi, qui irais péter plus haut que ... tongue

Dernière modification par PengouinPdt (Le 24/07/2012, à 17:34)


Ego ~
YUP.py :: Yet Uploader Pixxie.py :: script python : post d'images sur forum !

Hors ligne

#5 Le 24/07/2012, à 17:56

Jules Petibidon

Re : [Python] compréhension de ... list comprehension :p

Si j'ai bien compris ton but, tu veux récupérer de ta liste uniquement les éléments dont valide est True.

Dans ce cas, avec la structure faite dans le sens que je t'ai donné, tu as le choix pour faire ton tri :

>>> L = [
...     {'a': 'toto', 'b': True},
...     {'a': 'titi', 'b': True},
...     {'a': 'tata', 'b': False}]
>>> L
[{'a': 'toto', 'b': True}, {'a': 'titi', 'b': True}, {'a': 'tata', 'b': False}]
>>> #methode filter avec une lambda qui renvoie True ou False (soit la valeur de x['b']) pour garder ou jeter un élément de la liste
>>> filter(lambda x: x['b'], L)
[{'a': 'toto', 'b': True}, {'a': 'titi', 'b': True}]
>>> #methode comprehension 
>>> [x for x in L if x['b']]
[{'a': 'toto', 'b': True}, {'a': 'titi', 'b': True}]

Dernière modification par Jules Petibidon (Le 24/07/2012, à 17:58)

Hors ligne

#6 Le 24/07/2012, à 18:22

PengouinPdt

Re : [Python] compréhension de ... list comprehension :p

@petibidon: Chapeau. Merci.


Ego ~
YUP.py :: Yet Uploader Pixxie.py :: script python : post d'images sur forum !

Hors ligne

#7 Le 25/07/2012, à 11:24

AnsuzPeorth

Re : [Python] compréhension de ... list comprehension :p

PengouinPdt a écrit :

Et ce n'est pas moi, qui irais péter plus haut que ...

Je ne disais pas ça dans ce sens là, je t'assure ... Je citais juste le gars, et pour appuyer sur le fait qu'il est préférable, enfin amha, d'avoir du code le plus simple possible, et avec les list-compréhension à rallonge, on a vite fait de s'y perdre ...

PengouinPdt a écrit :

@petibidon: Chapeau.

+1
Voilà du simple et concis smile


Interface graphique pour bash, python ou autre: glade2script
Support Tchat: http://chat.jabberfr.org/muckl_int/inde … ade2script  (Hors ligne)

Hors ligne

#8 Le 25/07/2012, à 11:39

PengouinPdt

Re : [Python] compréhension de ... list comprehension :p

@ansuzPeorth: no soucis. Promis !


Ego ~
YUP.py :: Yet Uploader Pixxie.py :: script python : post d'images sur forum !

Hors ligne