2013-02-22 10 views
6

Załóżmy, że mam jakikolwiek iterableCzy istnieje jednofunkcyjny wydrukować iterables wartości

var = "ABCDEF"

otrzymuję iterable jak ten

it = itertools.combinations(var,2)

jest jakaś pojedyncza funkcja drukować wszystko wartości iterables jak

printall(it)

zamiast przy użyciu pętli for

+3

Dlaczego pętla 'for' jest problemem? –

+0

Nie wierzę, ale mogę się mylić ... – xxmbabanexx

+1

Czekaj ... możesz zrobić własny moduł z funkcją niestandardową i zainstalować go za pomocą distilus. – xxmbabanexx

Odpowiedz

14

To raczej zależy od tego, co chcesz, jeśli chcesz wydrukować wszystkie wartości, trzeba je obliczyć - iterable nie gwarantuje wartości są obliczane dopiero po ukończeniu wszystkich wymaganych, więc najprostszym sposobem osiągnięcia tego celu jest make a list:

print(list(iterable)) 

to będzie drukować elementów w normalnym formacie listy, które mogą być odpowiednie. Jeśli chcesz, aby każdy element na nowej linii, najlepszym rozwiązaniem jest, jak wspomniano, prosty dla pętli:

for item in iterable: 
    print(item) 

jeśli nie potrzebujesz danych w określonym formacie, ale po prostu trzeba je mieć czytelny (nie na przykład w jednym wierszu), możesz wypróbować the pprint module.

Ostateczna opcja, która tak naprawdę nie czuć jest optymalna, ale wspomnieć o kompletności, jest możliwe w 3.x, gdzie the print() function jest bardzo elastyczny:

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

Tu unpack the iterable jako argumenty print(), a następnie przekształć separator w znak nowej linii (w przeciwieństwie do zwykłej spacji).

+1

Warto również zauważyć, że po iteracji iteratora, jest on zużywany. –

+1

@JoelCornett Rzeczywiście. Chociaż, jeśli stworzyłeś listę, możesz zamiast tego wykonać iterację. –

+0

do druku (* iterable) jest zwycięzcą. –

4

Można użyć metody str.join i połączyć każdy element iteracji w nowej linii.

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

+1, ale warto zauważyć, że zakłada się, że elementy są ciągami. Jeśli nie, konieczne będzie [wyrażenie generatora lub zrozumienie listy] (http://www.youtube.com/watch?v=pShL9DCSIUw). –

1

Można użyć formatu, który pozwoli każdy element być sformatowany jako was proszę:

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

Każdy element nie musi być ciągiem niekoniecznie, ale musi mieć metodę __repr__ jeśli jest nie ciąg.

Następnie można łatwo napisać funkcję, pragnienie:

>>> 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'} 

używam listę, ale wszelkie iterable zrobi.

0

Można użyć chain() funkcji z itertools stworzyć iterator dla danych var a potem po prostu rozpakować za pomocą * Operator iterator

>>> 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 

Jeśli wystarczy iteracyjne nad istniejące dane i wydrukować go ponownie można użyć gwiazda * dla tego

>>> print(*var) 
A B C D E F 
>>> print(*var, sep='\n') 
A 
B 
C 
D 
E 
F 
Powiązane problemy