2013-02-22 8 views
6

Supponiamo che io ho la qualunque iterabileC'è qualche singola funzione per stampare iterables valori

var = "ABCDEF"

Ho l'iterabile come questo

it = itertools.combinations(var,2)

c'è qualche singola funzione per stampare tutti valori di iterables come

printall(it)

piuttosto che utilizzare il ciclo for

+3

Perché un ciclo 'for' è un problema? –

+0

Non ci credo, ma potrei sbagliarmi ... – xxmbabanexx

+1

Aspetta ... potresti creare il tuo modulo con una funzione personalizzata e installarlo usando distilus. – xxmbabanexx

risposta

14

Questo dipende piuttosto ciò che si vuole, se si desidera stampare tutti i valori, è necessario calcolare loro - un iterabile non garantisce i valori vengono calcolati fino a dopo che sono tutto ha richiesto, in modo che il modo più semplice per raggiungere questo obiettivo è quello di make a list:

print(list(iterable)) 

questo stamperà gli elementi nel formato lista normale, che possono essere adatti. Se si desidera che ogni voce su una nuova linea, l'opzione migliore è, come lei ha ricordato, un semplice ciclo for:

for item in iterable: 
    print(item) 

Se non hanno bisogno dei dati in un formato specifico, ma solo bisogno di essere leggibile (non tutto su una riga, per esempio), si consiglia di controllare the pprint module.

Un ultima opzione, che non mi sento veramente è ottimale, ma menzionare per completezza, è possibile in 3.x, dove the print() function è molto flessibile:

print(*iterable, sep="\n") 

Qui unpack the iterable come argomenti a print() e quindi rendere il separatore una nuova riga (al contrario del solito spazio).

+1

Inoltre, potrebbe essere utile sottolineare che una volta iteratore è stato iterato, viene consumato. –

+1

@JoelCornett Effettivamente. Sebbene tu abbia prodotto una lista, puoi invece iterare su quella. –

+0

per la stampa (* iterable) è un vincitore. –

4

È possibile utilizzare il metodo str.join e unire ogni elemento dell'iterazione su una nuova riga.

print('\n'.join(it)) 
+4

+1, ma vale la pena notare che si presume che gli elementi siano stringhe. In caso contrario, [sarà necessaria un'espressione generatore o la comprensione di una lista] (http://www.youtube.com/watch?v=pShL9DCSIUw). –

1

È possibile utilizzare il formato che permetterà ciascun elemento da formattato come ti pare:

>>> print '\n'.join('{:>10}'.format(e) for e in iter([1,2,'1','2',{1:'1'}])) 
     1 
     2 
     1 
     2 
    {1: '1'} 

Ogni elemento non ha bisogno di essere una stringa necessariamente, ma deve avere un metodo __repr__ se è non una stringa.

È quindi possibile scrivere facilmente la funzione che si desidera:

>>> def printall(it,w): print '\n'.join('{:>{w}}'.format(e,w=w) for e in it) 
>>> printall([1,2,'3','4',{5:'6'}],10) 
     1 
     2 
     3 
     4 
    {5: '6'} 

Sto usando una lista, ma qualsiasi iterabile farebbe.

0

È possibile utilizzare chain() funzione dal itertools per creare iteratore per i dati var e poi basta scompattare usando * operatore del iteratore

>>> from itertools import chain 
>>> var = 'ABCDEF' 
>>> print(*chain(var)) 
A B C D E F 
>>> print(*chain(var), sep='\n') 
A 
B 
C 
D 
E 
F 

Se avete solo bisogno di iterare su dati esistenti e stamparlo di nuovo si può usare operatore stella * per questo

>>> print(*var) 
A B C D E F 
>>> print(*var, sep='\n') 
A 
B 
C 
D 
E 
F 
Problemi correlati