tableaux

Le
JBB
Bonjour, mon problème est très simple:
soit un tableau
t = [ 1,2,8,12,74]
je veux obtenir le tableau suivant:
[ 1,1,2,2,8,8,12,12,74,74]
ou d'un manière plus générale:
soit 2 fonctions f et g:
par exemple:
def f(x):
return & % 255
def g(x):
return (x >> 8) % 255

je veux obtenir:
[f(t[0],g(t[0]),f(t[1],g(t[1]),]

ou encore mieux avec une fontion
def h(x):
return f(x),g(x)

du coup je fait un truc du genre:
[h(x) for x in t] mais ca me donne un tableau de tupple et je veux un tableau 'à plat'.



Y a sûrement un moyen très simple de faire ça.
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses Page 1 / 3
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Bruno Desthuilliers
Le #596797
Bonjour, mon problème est très simple:
soit un tableau
t = [ 1,2,8,12,74]


Disons une liste, puisque c'est le nom de ce type en Python.

je veux obtenir le tableau suivant:
[ 1,1,2,2,8,8,12,12,74,74]
ou d'un manière plus générale:
soit 2 fonctions f et g:
par exemple:
def f(x):
return & % 255
def g(x):
return (x >> 8) % 255

je veux obtenir:
[f(t[0],g(t[0]),f(t[1],g(t[1]),...]

ou encore mieux avec une fontion
def h(x):
return f(x),g(x)

du coup je fait un truc du genre:
[h(x) for x in t] mais ca me donne un tableau de tupple et je veux un
tableau 'à plat'.



Y a sûrement un moyen très simple de faire ça.


Bref, tu veux passer d'une liste de tuples à une liste à plat...

# Q&D, y a surement plus élégant (et plus générique),
# mais ca répond à tes specs
def flatten(tlist):
flat = []
extend = flat.extend
for item in tlist:
extend(item)
return flat

flatten([h(x) for x in t])

Maric Michaud
Le #596796
Bruno Desthuilliers wrote:

...
du coup je fait un truc du genre:
[h(x) for x in t] mais ca me donne un tableau de tupple et je veux un
tableau 'à plat'.



Y a sûrement un moyen très simple de faire ça.


Bref, tu veux passer d'une liste de tuples à une liste à plat...

# Q&D, y a surement plus élégant (et plus générique),
# mais ca répond à tes specs
def flatten(tlist):
flat = []
extend = flat.extend
for item in tlist:
extend(item)
return flat

flatten([h(x) for x in t])


Peut-être plus simple et plus générique :

from itertools import chain
nested = (["1", "2"], ["3", "4", "5"])
[ int(e) for e in chain(*nested) ]
[1, 2, 3, 4, 5]





_____________

Maric Michaud



Bruno Desthuilliers
Le #596795
(snip - en bref, passer d'une liste de tuples à une liste plate)
Peut-être plus simple et plus générique :

from itertools import chain
nested = (["1", "2"], ["3", "4", "5"])
[ int(e) for e in chain(*nested) ]
[1, 2, 3, 4, 5]





je me disais bien qu'il y avait quelque chose à faire avec itertools.




JBB
Le #596794
(snip - en bref, passer d'une liste de tuples à une liste plate)
Peut-être plus simple et plus générique :

from itertools import chain
nested = (["1", "2"], ["3", "4", "5"])
[ int(e) for e in chain(*nested) ]






c'est quoi cette syntaxe avec un '*' ?
encore une partie (obscure ) de python que je ne connais pas
[1, 2, 3, 4, 5]


je me disais bien qu'il y avait quelque chose à faire avec itertools.






Laurent Pointal
Le #596568
(snip - en bref, passer d'une liste de tuples à une liste plate)
Peut-être plus simple et plus générique :

from itertools import chain
nested = (["1", "2"], ["3", "4", "5"])
[ int(e) for e in chain(*nested) ]






c'est quoi cette syntaxe avec un '*' ?
encore une partie (obscure ) de python que je ne connais pas


C'est la contrepartie de la définition d'une fonction avec *args pour
permettre de recevoir un nombre variable de paramètres [1].

Utilisé lors d'un appel, la syntaxe f(*x) te permet d'appeler f comme si
tu lui avait donné les éléments de x en paramètre:
f(*x) <===> f(x[0],x[1],...,x[n-1])


Avant on utilisait la fonction builtin apply().

A+


[1] Voir **kwargs pour les paramètres nommés, passés via un dictionnaire.






Maric Michaud
Le #596567
JBB wrote:

[ int(e) for e in chain(*nested) ]






c'est quoi cette syntaxe avec un '*' ?
encore une partie (obscure ) de python que je ne connais pas


C'est nouveau (depuis 2.4 de mémoire)
c'est l'équivalent de :

apply(chain, nested)

Cela veut dire que nested doit être compris comme la liste des arguments
appliqués à la fonction chain.

La notation est symétrique avec la déclaration des arguments variables :

def f(*args, **kwargs) : print args, kwargs
...


f(1, 2, 3, named_arg=None)
(1, 2, 3) {'named_arg': None}




On peut alors faire :
f(*(1, 2, 3), **{'named_arg' : None})
(1, 2, 3) {'named_arg': None}





--
_____________

Maric Michaud
_____________






Bruno Desthuilliers
Le #596566
JBB wrote:

[ int(e) for e in chain(*nested) ]
c'est quoi cette syntaxe avec un '*' ?





encore une partie (obscure ) de python que je ne connais pas


C'est nouveau (depuis 2.4 de mémoire)


Heu... Pas vraiment, non. C'était déjà là dans la 1.5.2 (en 1999).







Laurent Pointal
Le #596565
Bruno Desthuilliers wrote:

JBB wrote:

[ int(e) for e in chain(*nested) ]
c'est quoi cette syntaxe avec un '*' ?





encore une partie (obscure ) de python que je ne connais pas


C'est nouveau (depuis 2.4 de mémoire)


Heu... Pas vraiment, non. C'était déjà là dans la 1.5.2 (en 1999).


Tu es sûr ?

Côté tutoriel Python, ça apparaît dans le 2.4 (chapitre "4.7.4 Unpacking
Argument Lists" du tutoriel). Et je ne me souviens pas de l'avoir déjà vu
avant (en tout cas, pour PyExp dont le développement a commencé sur une
1.5.2 et s'est continué jusqu'à la 2.1, j'ai été obligé d'utiliser apply).

A+

Laurent.








Maric Michaud
Le #596564
Bruno Desthuilliers wrote:

C'est nouveau (depuis 2.4 de mémoire)


Heu... Pas vraiment, non. C'était déjà là dans la 1.5.2 (en 1999).


Ok, c'est juste, enfin ça marche pour 2.1 en tout cas, je suis juste passé à
côté à cette époque. J'étais resté sur cette idée puisque la fonction apply
n'est signalée "deprecated" que depuis 2.3 (et non 2.4).

--
_____________

Maric Michaud


Méta-MCI
Le #596563
Bonsoir !


t = [ 1,2,8,12,74]
[i for i in t for j in [1]*2]

(pour n, remplacer 2 par n)

@+

MCI
Publicité
Poster une réponse
Anonyme