2013-02-22 55 views
6

假設我有任何迭代是否有任何單一功能的打印iterables值

var = "ABCDEF"

我得到這樣

it = itertools.combinations(var,2)

可迭代沒有任何單一功能的打印全部迭代值如

printall(it)

,而不是使用for循環

+3

爲什麼'for'循環有問題? – 2013-02-22 01:36:55

+0

我不這麼認爲,但我可能是錯的... – xxmbabanexx 2013-02-22 01:37:02

+1

等等......您可以用自定義功能製作自己的模塊並使用酒精進行安裝。 – xxmbabanexx 2013-02-22 01:37:56

回答

14

這個相當取決於你想要什麼,如果你想打印出所有的值,你需要計算他們 - 一個可迭代不保證值計算,直到它們之後所有要求,所以要實現這一目標的最簡單方法是make a list

print(list(iterable)) 

這將打印出正常的列表格式中的項目,這可能是合適的。如果你想在一個新行的每個項目,最好的選擇是,正如你提到的,一個簡單的for循環:

for item in iterable: 
    print(item) 

如果您不需要特定格式的數據,而只是需要它(例如,不是全部在一行上),您可能需要檢出the pprint module

最後一個選擇,我並不覺得自己真的是最優的,但對於提完整性,有可能在3.x中,其中the print() function非常靈活:

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

這裏我們unpack the iterable作爲參數print(),然後使分隔符成爲換行符(而不是通常的空格)。

+1

另外,值得指出的是,一旦迭代器迭代完成,它就會被消耗。 – 2013-02-22 02:00:22

+1

@JoelCornett確實。雖然如果你已經制作了一個列表,那麼你可以重複一遍。 – 2013-02-22 02:04:46

+0

用於打印(* iterable)是勝利者。 – 2015-08-08 00:39:41

4

您可以使用str.join方法並將新迭代器的每個元素連接到一個新行上。

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

+1,但值得注意的是,假設元素是字符串。如果不是,則需要[生成器表達式或列表理解](http://www.youtube.com/watch?v=pShL9DCSIUw)。 – 2013-02-22 01:41:25

1

可以使用的格式,這將使每個元素進行格式化,請你:

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

每個元素並不需要是一個字符串必然的,但必須有一個__repr__方法,如果它是不是一個字符串。

然後,您可以輕鬆地編寫你想要的功能:

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

我使用的名單,但可迭代會做。

0

可以使用chain()功能從itertools創建VAR數據迭代器,然後就拆開使用*迭代器的操作

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

如果你只需要遍歷現有的數據,然後再打印出來就可以使用明星運營商*爲此

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