Imprimir la lista de python en grupos de 3

Tengo una lista de 107 nombres, me gustaría imprimirlos en grupos de 3 o más, con cada nombre separado por una pestaña, una nueva línea después de cada línea, hasta el final. ¿Cómo puedo hacer esto?

Por supuesto, con el for item in list print item solo obtengo 1 nombre por línea, lo cual está bien, supongo, pero me gustaría incluir más en la consola a la vez, así que me gustaría imprimir 3 o más nombres en cada línea como Voy a través de la lista, así que en lugar de:

 name1 name2 name3 name4 name5 name6 

obtendría

 name1 name2 name3 name4 name5 name6 

Es un poco difícil buscar una respuesta a esto, no he podido encontrar lo que necesito o lo que puedo entender, la mayoría de las cosas que encontré solo trataron con len() o range() y me confundieron. ¿Hay alguna forma sencilla de hacer esto? ¡Gracias!

[edit: update] usando el ejemplo de @ inspectorG4dget de:

     for i in range(0, len(listnames), 5): print '\t\t'.join(listnames[i:i+5]) 

    Me sale lo siguiente: http://www.pasteall.org/pic/show.php?id=41159

    ¿Cómo puedo limpiar eso para que todo esté bien alineado en cada columna? ¿Es lo que quiero hacer fácilmente?

    1)

     li = ['sea','mountain','desert', 'Emma','Cathy','Kate', 'ii','uuuuuuuuuuuuuuuuuuu','aaa', 'round','flat','sharp', 'blueberry','banana','apple', 'red','purple','white', 'hen','tiger'] a,b = divmod(len(li),3) itn = iter(li).next print ''.join('%s\t%s\t%s\n' % (itn(),itn(),itn()) for i in xrange(a))\ + ('%s\t%s\t\n' % (itn(),itn()) if b==2 else '%s\t\n' % itn() if b==1 else '') 

    resultado

     sea mountain desert Emma Cathy Kate ii uuuuuuuuuuuuuuuuuuu aaa round flat sharp blueberry banana apple red purple white hen tiger 

    .

    2)

    Y para alinear en columnas cuyo ancho depende del elemento más largo de la lista:

     li = ['sea','mountain','desert', 'Emma','Cathy','Kate', 'HH','VVVVVVV','AAA', 'round','flat','sharp', 'blueberry','banana','apple', 'red','purple','white', 'hen','tiger'] maxel = max(len(el) for el in li) a,b = divmod(len(li),3) itn = iter(li).next form = '%%-%ds\t%%-%ds\t%%-%ds\n' % (maxel,maxel,maxel) print ''.join(form % (itn(),itn(),itn()) for i in xrange(a))\ + ('%%-%ds\t%%-%ds\t\n' %(maxel,maxel) % (itn(),itn()) if b==2 else '%%-%ds\t\n' % ma% itn() if b==1 else '') 

    resultado

     sea mountain desert Emma Cathy Kate HH VVVVVVV AAA round flat sharp blueberry banana apple red purple white hen tiger 

    .

    3)

    Para alinear en la columna, el ancho de cada columna depende del elemento más largo en ella:

     li = ['sea','mountain','desert', 'Emma','Cathy','Kate', 'HH','VVVVVVV','AAA', 'round','flat','sharp', 'nut','banana','apple', 'red','purple','white', 'hen','tiger'] maxel0 = max(len(li[i]) for i in xrange(0,len(li),3)) maxel1 = max(len(li[i]) for i in xrange(1,len(li),3)) maxel2 = max(len(li[i]) for i in xrange(2,len(li),3)) a,b = divmod(len(li),3) itn = iter(li).next form = '%%-%ds\t%%-%ds\t%%-%ds\n' % (maxel0,maxel1,maxel2) print ''.join(form % (itn(),itn(),itn()) for i in xrange(a))\ + ('%%-%ds\t%%-%ds\t\n' %(maxel0,maxel1) % (itn(),itn()) if b==2 else '%%-%ds\t\n' % maxel0 % itn() if b==1 else '') 

    resultado

     sea mountain desert Emma Cathy Kate HH VVVVVVV AAA round flat sharp nut banana apple red purple white hen tiger 

    4)

    He modificado el algoritmo para generalizar a cualquier número de columnas deseadas.
    El número deseado de columnas se debe pasar como argumento al parámetro nc :

     from itertools import imap,islice li = ['sea','mountain','desert', 'Emma','Cathy','Kate', 'HH','VVVVVVV','AAA', 'round','flat','sharp', 'nut','banana','apple', 'heeeeeeeeeeen','tiger','snake' 'red','purple','white', 'atlantic','pacific','antarctic', 'Bellini'] print 'len of li == %d\n' % len(li) def cols_print(li,nc): maxel = tuple(max(imap(len,islice(li,st,None,nc))) for st in xrange(nc)) nblines,tail = divmod(len(li),nc) stakes = (nc-1)*['%%-%ds\t'] + ['%%-%ds'] form = ''.join(stakes) % maxel itn = iter(li).next print '\n'.join(form % tuple(itn() for g in xrange(nc)) for i in xrange(nblines)) if tail: print ''.join(stakes[nc-tail:]) % maxel[0:tail] % tuple(li[-tail:]) + '\n' else: print for nc in xrange(3,8): cols_print(li,nc) print '-----------------------------------------------------------' 

    resultado

     len of li == 24 sea mountain desert Emma Cathy Kate HH VVVVVVV AAA round flat sharp nut banana apple heeeeeeeeeeen tiger snakered purple white atlantic pacific antarctic Bellini ----------------------------------------------------------- sea mountain desert Emma Cathy Kate HH VVVVVVV AAA round flat sharp nut banana apple heeeeeeeeeeen tiger snakered purple white atlantic pacific antarctic Bellini ----------------------------------------------------------- sea mountain desert Emma Cathy Kate HH VVVVVVV AAA round flat sharp nut banana apple heeeeeeeeeeen tiger snakered purple white atlantic pacific antarctic Bellini ----------------------------------------------------------- sea mountain desert Emma Cathy Kate HH VVVVVVV AAA round flat sharp nut banana apple heeeeeeeeeeen tiger snakered purple white atlantic pacific antarctic Bellini ----------------------------------------------------------- sea mountain desert Emma Cathy Kate HH VVVVVVV AAA round flat sharp nut banana apple heeeeeeeeeeen tiger snakered purple white atlantic pacific antarctic Bellini ----------------------------------------------------------- 

    .

    Pero prefiero una visualización en la que no hay tabs entre columnas, sino solo un número dado de caracteres.
    En el siguiente código, elegí separar las columnas por 2 caracteres: es el 2 en la línea

     maxel = tuple(max(imap(len,islice(li,st,None,nc)))+2 

    El código

     from itertools import imap,islice li = ['sea','mountain','desert', 'Emma','Cathy','Kate', 'HH','VVVVVVV','AAA', 'round','flat','sharp', 'nut','banana','apple', 'heeeeeeeeeeen','tiger','snake' 'red','purple','white', 'atlantic','pacific','antarctic', 'Bellini'] print 'len of li == %d\n' % len(li) def cols_print(li,nc): maxel = tuple(max(imap(len,islice(li,st,None,nc)))+2 for st in xrange(nc)) nblines,tail = divmod(len(li),nc) stakes = nc*['%%-%ds'] form = ''.join(stakes) % maxel itn = iter(li).next print '\n'.join(form % tuple(itn() for g in xrange(nc)) for i in xrange(nblines)) if tail: print ''.join(stakes[nc-tail:]) % maxel[0:tail] % tuple(li[-tail:]) + '\n' else: print for nc in xrange(3,8): cols_print(li,nc) print 'mwmwmwmwmwmwmwmwmwmwmwmwmwmwmwmwmwmwmwmwmwmwmwmwmwmwmwmwmwmwmwmwmwmwm' 

    el resultado

     len of li == 24 sea mountain desert Emma Cathy Kate HH VVVVVVV AAA round flat sharp nut banana apple heeeeeeeeeeen tiger snakered purple white atlantic pacific antarctic Bellini mwmwmwmwmwmwmwmwmwmwmwmwmwmwmwmwmwmwmwmwmwmwmwmwmwmwmwmwmwmwmwmwmwmwm sea mountain desert Emma Cathy Kate HH VVVVVVV AAA round flat sharp nut banana apple heeeeeeeeeeen tiger snakered purple white atlantic pacific antarctic Bellini mwmwmwmwmwmwmwmwmwmwmwmwmwmwmwmwmwmwmwmwmwmwmwmwmwmwmwmwmwmwmwmwmwmwm sea mountain desert Emma Cathy Kate HH VVVVVVV AAA round flat sharp nut banana apple heeeeeeeeeeen tiger snakered purple white atlantic pacific antarctic Bellini mwmwmwmwmwmwmwmwmwmwmwmwmwmwmwmwmwmwmwmwmwmwmwmwmwmwmwmwmwmwmwmwmwmwm sea mountain desert Emma Cathy Kate HH VVVVVVV AAA round flat sharp nut banana apple heeeeeeeeeeen tiger snakered purple white atlantic pacific antarctic Bellini mwmwmwmwmwmwmwmwmwmwmwmwmwmwmwmwmwmwmwmwmwmwmwmwmwmwmwmwmwmwmwmwmwmwm sea mountain desert Emma Cathy Kate HH VVVVVVV AAA round flat sharp nut banana apple heeeeeeeeeeen tiger snakered purple white atlantic pacific antarctic Bellini mwmwmwmwmwmwmwmwmwmwmwmwmwmwmwmwmwmwmwmwmwmwmwmwmwmwmwmwmwmwmwmwmwmwm 

    También puedes probar esto:

     from itertools import izip l = ['name1', 'name2', 'name3', 'name4', 'name5', 'name6'] for t in izip(*[iter(l)]*3): print '\t'.join(t) 
     nombre1 nombre2 nombre3
     nombre4 nombre5 nombre6
    

    Si no está seguro de que la longitud de la lista sea un múltiplo de 3, puede usar izip_longest , aplicando la misma idea:

     from itertools import izip_longest as izipl l = ['name1', 'name2', 'name3', 'name4', 'name5', 'name6', 'name7'] for t in izipl(fillvalue='', *[iter(l)]*3): print '\t'.join(t) 
     nombre1 nombre2 nombre3
     nombre4 nombre5 nombre6
     nombre7   
    

    Esto debería hacerlo:

     In [12]: L Out[12]: ['name1', 'name2', 'name3', 'name4', 'name5', 'name6'] In [13]: for i in range(0,len(L),3): print ' '.join(L[i:i+3]) name1 name2 name3 name4 name5 name6 

    EDITAR : para obtener todo en un ancho fijo (algo de código que escribí durante un tiempo para convertir datos en columnas en una tabla. Todo lo que tiene que hacer es crear una columna en sus datos y llamar a este código antiguo):

     def tabularize(infilepath, outfilepath, delim='\t', largeFile=False): """ Return nothing Write into the file in outfilepath, the contents of infilepath, expressed in tabular form. The tabular form is similar to the way in which SQL tables are displayed. If largeFile is set to True, then no caching of lines occurs. However, two passes of the infile are required""" if largeFile: widths = getWidths(infilepath, delim) else: with open(infilepath) as infile: lines = [line.strip().split(delim) for line in infile.readlines() if line.strip()] widths = [max([len(row) for row in rows])+2 for rows in izip_longest(*lines, fillvalue="")] with open(outfilepath, 'w') as outfile: outfile.write("+") for width in widths: outfile.write('-'*width + "+") outfile.write('\n') for line in lines: outfile.write("|") for col,width in izip_longest(line,widths, fillvalue=""): outfile.write("%s%s%s|" %(' '*((width-len(col))/2), col, ' '*((width+1-len(col))/2))) outfile.write('\n+') for width in widths: outfile.write('-'*width + "+") outfile.write('\n') def getWidths(infilepath, delim): answer = defaultdict(int) with open(infilepath) as infile: for line in infile: cols = line.strip().split(delim) lens = map(len, cols) for i,l in enumerate(lens): if answer[i] < l: answer[i] = l return [answer[k] for k in sorted(answer)] def main(L, n, infilepath, outfilepath): iterator = iter(L) with open(infilepath, 'w') as infile: for row in itertools.izip_longest([iterator]*n, fillavalue=''): infile.write('\t'.join(row)+'\n') if len(L) > 10**6: largeFile = True tabularize(infilepath, outfilepath, delim='\t', largeFile) 

    Intente usar itertools creo que es una solución mucho más simple.

     from itertools import izip_longest def grouper(n, iterable, fillvalue=None): args = [iter(iterable)] * n return izip_longest(fillvalue=fillvalue, *args) names = ['name1', 'name2', 'name3', 'name4', 'name5', 'name6'] for item1 in grouper(3, names, ''): print '\t'.join(item1) 

    Resultado:

     name1 name2 name3 name4 name5 name6