Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

tableaux

30 réponses
Avatar
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.

10 réponses

1 2 3
Avatar
Bruno Desthuilliers
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])

Avatar
Maric Michaud
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



Avatar
Bruno Desthuilliers
(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.




Avatar
JBB
(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.






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






Avatar
Maric Michaud
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
_____________






Avatar
Bruno Desthuilliers
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).







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








Avatar
Maric Michaud
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


Avatar
Méta-MCI
Bonsoir !


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

(pour n, remplacer 2 par n)

@+

MCI
1 2 3