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

Découper un tableau

15 réponses
Avatar
ReM
Bonjour,

Je cherche à découper un tableau en n colonnes avec le choix du sens.

Exemple :
t = [1,2,3,4,5,6,7,8]

t1, t2, t3 = split_tab( t, n = 3, sens = "HORIZONTAL" )
#Résultat :
t1 = [1,2,3]
t2 = [4,5,6]
t3 = [7,8,None]

t1, t2, t3 = split_tab( t, n = 3, sens = "VERTICAL" )
#Résultat :
t1 = [1,4,7]
t2 = [2,5,8]
t3 = [3,6,None]

Quelqu'un aurait il déjà fait ça ?
Merci ;o)

10 réponses

1 2
Avatar
Bruno Desthuilliers
ReM wrote:
Bonjour,

Je cherche à découper un tableau en n colonnes avec le choix du sens.

Exemple :
t = [1,2,3,4,5,6,7,8]

t1, t2, t3 = split_tab( t, n = 3, sens = "HORIZONTAL" )
#Résultat :
t1 = [1,2,3]
t2 = [4,5,6]
t3 = [7,8,None]

t1, t2, t3 = split_tab( t, n = 3, sens = "VERTICAL" )
#Résultat :
t1 = [1,4,7]
t2 = [2,5,8]
t3 = [3,6,None]

Quelqu'un aurait il déjà fait ça ?


Non, mais bon...

def complete(tab, n):
return tab + [None for i in range(n - (len(tab) % n))]

def split_horizontal(tab, n):
seq = complete(tab, n)
return [seq[start:start+n] for start in xrange(0, len(tab), n)]

def split_vertical(tab, n):
seq = complete(tab, n)
return [seq[start::n] for start in xrange(n)]

def split_tab(tab, n, sens):
return {"VERTICAL" : split_vertical,
"HORIZONTAL" : split_horizontal}[sens](tab, n)

Merci ;o)


de rien

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

Avatar
ReM
ReM wrote:
Bonjour,

Je cherche à découper un tableau en n colonnes avec le choix du sens.

Exemple :
t = [1,2,3,4,5,6,7,8]

t1, t2, t3 = split_tab( t, n = 3, sens = "HORIZONTAL" )
#Résultat :
t1 = [1,2,3]
t2 = [4,5,6]
t3 = [7,8,None]

t1, t2, t3 = split_tab( t, n = 3, sens = "VERTICAL" )
#Résultat :
t1 = [1,4,7]
t2 = [2,5,8]
t3 = [3,6,None]

Quelqu'un aurait il déjà fait ça ?


Non, mais bon...

def complete(tab, n):
return tab + [None for i in range(n - (len(tab) % n))]

def split_horizontal(tab, n):
seq = complete(tab, n)
return [seq[start:start+n] for start in xrange(0, len(tab), n)]

def split_vertical(tab, n):
seq = complete(tab, n)
return [seq[start::n] for start in xrange(n)]

def split_tab(tab, n, sens):
return {"VERTICAL" : split_vertical,
"HORIZONTAL" : split_horizontal}[sens](tab, n)

Merci ;o)


de rien

Que dire de mieux à part un grand MERCI !!!



Avatar
Boris Borcic
ReM wrote:
Bonjour,

Je cherche à découper un tableau en n colonnes avec le choix du sen s.

Exemple :
t = [1,2,3,4,5,6,7,8]

t1, t2, t3 = split_tab( t, n = 3, sens = "HORIZONTAL" )
#Résultat :
t1 = [1,2,3]
t2 = [4,5,6]
t3 = [7,8,None]

t1, t2, t3 = split_tab( t, n = 3, sens = "VERTICAL" )
#Résultat :
t1 = [1,4,7]
t2 = [2,5,8]
t3 = [3,6,None]

Quelqu'un aurait il déjà fait ça ?
Merci ;o)


variante de solution toute en lambdas...

complete = lambda t,n : t + -len(t)%n*[None]

split_h = lambda t,n : zip(*[iter(t)]*n)

split_v = lambda t,n : zip(*split_h(t,len(t)/n))

split_tab = lambda t,n,dir : (split_h,split_v)['V' in dir](complete(t,n ),n)

Avatar
Bruno Desthuilliers
Boris Borcic wrote:
(snip)

variante de solution toute en lambdas...

complete = lambda t,n : t + -len(t)%n*[None]

split_h = lambda t,n : zip(*[iter(t)]*n)

split_v = lambda t,n : zip(*split_h(t,len(t)/n))

split_tab = lambda t,n,dir : (split_h,split_v)['V' in dir](complete(t,n),n
)


Sauvage ! Même moi, j'aurais pas pas osé !-)

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

Avatar
Gerard Flanagan
ReM wrote:
Bonjour,

Je cherche à découper un tableau en n colonnes avec le choix du sens.

Exemple :
t = [1,2,3,4,5,6,7,8]

t1, t2, t3 = split_tab( t, n = 3, sens = "HORIZONTAL" )
#Résultat :
t1 = [1,2,3]
t2 = [4,5,6]
t3 = [7,8,None]

t1, t2, t3 = split_tab( t, n = 3, sens = "VERTICAL" )
#Résultat :
t1 = [1,4,7]
t2 = [2,5,8]
t3 = [3,6,None]



et avec generators:

def rows( N, n ):
for i in xrange(N):
yield i // n, i % n

def split_tab( tab, n, verticalúlse):
seq = tab + [None for i in range(n - (len(tab) % n))]
d = dict(zip(rows(len(seq),n),seq))
for i in range(n):
ret = []
for j in range(n):
if vertical:
ret.append( d[(j,i)] )
else:
ret.append( d[(i,j)] )
yield ret

t = [1,2,3,4,5,6,7,8]

print list(split_tab(t, 3))

[[1, 2, 3], [4, 5, 6], [7, 8, 9]]

print list(split_tab(t, 3, True))

[[1, 4, 7], [2, 5, 8], [3, 6, 9]]


Gerard

Avatar
Gerard Flanagan
Gerard Flanagan wrote:
ReM wrote:
Bonjour,

Je cherche à découper un tableau en n colonnes avec le choix du sen s.

Exemple :
t = [1,2,3,4,5,6,7,8]

t1, t2, t3 = split_tab( t, n = 3, sens = "HORIZONTAL" )
#Résultat :
t1 = [1,2,3]
t2 = [4,5,6]
t3 = [7,8,None]

t1, t2, t3 = split_tab( t, n = 3, sens = "VERTICAL" )
#Résultat :
t1 = [1,4,7]
t2 = [2,5,8]
t3 = [3,6,None]



et avec generators:

def rows( N, n ):
for i in xrange(N):
yield i // n, i % n

def split_tab( tab, n, verticalúlse):
seq = tab + [None for i in range(n - (len(tab) % n))]
d = dict(zip(rows(len(seq),n),seq))
for i in range(n):
ret = []
for j in range(n):
if vertical:
ret.append( d[(j,i)] )
else:
ret.append( d[(i,j)] )
yield ret

t = [1,2,3,4,5,6,7,8]

print list(split_tab(t, 3))

[[1, 2, 3], [4, 5, 6], [7, 8, 9]]

print list(split_tab(t, 3, True))

[[1, 4, 7], [2, 5, 8], [3, 6, 9]]


Gerard


Pardon, les resultats sont:

[[1, 2, 3], [4, 5, 6], [7, 8, None]]
[[1, 4, 7], [2, 5, 8], [3, 6, None]]

Gerard


Avatar
Michel Claveau
Bonsoir !

Une petite version de plus :


t = [1,2,3,4,5,6,7,8]

def split_tab(t, n=3, sens="HORIZONTAL"):
t.extend([None]*(-len(t)%n))
if sens=="HORIZONTAL":
return [t[i:i+n] for i in range(0,len(t),n)]
else:
return [t[i::n] for i in range(n)]

print split_tab(t,3,"HORIZONTAL")
print split_tab(t,3,"VERTICAL")

--
@-salutations

Michel Claveau
Avatar
Gerard Flanagan
Gerard Flanagan wrote:
ReM wrote:
Bonjour,

Je cherche à découper un tableau en n colonnes avec le choix du sen s.

Exemple :
t = [1,2,3,4,5,6,7,8]

t1, t2, t3 = split_tab( t, n = 3, sens = "HORIZONTAL" )
#Résultat :
t1 = [1,2,3]
t2 = [4,5,6]
t3 = [7,8,None]

t1, t2, t3 = split_tab( t, n = 3, sens = "VERTICAL" )
#Résultat :
t1 = [1,4,7]
t2 = [2,5,8]
t3 = [3,6,None]



et avec generators:

def rows( N, n ):
for i in xrange(N):
yield i // n, i % n

def split_tab( tab, n, verticalúlse):
seq = tab + [None for i in range(n - (len(tab) % n))]
d = dict(zip(rows(len(seq),n),seq))
for i in range(n):
ret = []
for j in range(n):
if vertical:
ret.append( d[(j,i)] )
else:
ret.append( d[(i,j)] )
yield ret

t = [1,2,3,4,5,6,7,8]

print list(split_tab(t, 3))

[[1, 2, 3], [4, 5, 6], [7, 8, 9]]

print list(split_tab(t, 3, True))

[[1, 4, 7], [2, 5, 8], [3, 6, 9]]


Gerard



class Tableau(list):

def __init__(self, items, numcols):
list.__init__(self, items)
self.numcols = numcols

def __rows_get(self):
return split_tab(self, self.numcols)

rows = property(__rows_get)

def __cols_get(self):
return split_tab(self, self.numcols, True)

cols = property(__cols_get)

table = Tableau(range(1,9),3)
print table
for r in table.rows:
print r
for c in table.cols:
print c

-----------

Gerard


Avatar
Méta-MCI
Re !


Sans doute est-il préférable d'utiliser une variable locale, pour éviter de
bousiller la liste originale :



t = [1,2,3,4,5,6,7,8]

def split_tab(tt, n=3, sens="HORIZONTAL"):
tt.extend([None]*(-len(t)%n))
if sens=="HORIZONTAL":
return [tt[i:i+n] for i in range(0,len(tt),n)]
else:
return [tt[i::n] for i in range(n)]

print split_tab(t,3)
print split_tab(t,3,"VERTICAL")






@-salutations

Michel Claveau
Avatar
Méta-MCI
Désolé !

J'ai écrit trop vite, alors que j'aurais dû tourner 7 fois le clavier dans
la bouche de la souris.
Mais, bon, vous aurez corrigé/adapté le code vous-même.

@-salutations

MCI
1 2