2011-10-17 18 views
4
>>> import itertools 
>>> n = [1,2,3,4] 
>>> combObj = itertools.combinations(n,3) 
>>> 
>>> combObj 
<itertools.combinations object at 0x00000000028C91D8> 
>>> 
>>> list(combObj) 
[(1, 2, 3), (1, 2, 4), (1, 3, 4), (2, 3, 4)] 
>>> 
>>> for i in list(combObj): #This prints nothing 
...  print(i) 
... 
  1. 知道怎樣才能combObj迭代?與組合的工作對象在Python

  2. 我如何轉換
    [(1, 2, 3), (1, 2, 4), (1, 3, 4), (2, 3, 4)]

    [[1, 2, 3], [1, 2, 4], [1, 3, 4], [2, 3, 4]]

回答

7

一旦你通過itertools.combinations對象重複一次,它被使用了,你不能迭代它第二次。

如果您需要重新使用它,正確的方法是使其成爲listtuple。你需要做的就是給它一個名字(把它分配給一個變量),這樣它就會堅持下去。

combList = list(combObject) # Don't iterate over it before you do this! 

如果你想遍歷它只有一次,你不就可以了叫list都:

for i in combObj: # Don't call `list` on it before you do this! 
    print(i) 

邊注:標準的方式來命名對象實例/正常變量會是comb_obj而不是combObj。有關更多信息,請參閱PEP-8

要內tuple秒值進行轉換,以list S,使用列表理解和list()內置:

comb_list = [(1, 2, 3), (1, 2, 4), (1, 3, 4), (2, 3, 4)] 
comb_list = [list(item) for item in comb_list] 
+0

明白了!我不知道你不能第二次迭代它。謝謝!關於PEP8,我已經閱讀過它,但對於我來說,改變我對變量,函數等的命名方式感覺很難。我不知道,每當我用不同的語言工作時,改變一種風格並不合適。 –

+0

如果你只是爲自己編碼,那麼使用任何你喜歡的風格都不是問題。但是,如果您將代碼提交給任何較大的社區(不論是否專業),則通常需要遵守其風格規則。 Python只是試圖在一種風格下統一所有的社區 - 他們減少了你需要知道的風格的數量,而不是增加它。我希望我總是可以用自己的風格編碼,這是不可能的。 – agf

0

要轉換到一個列表的列表,你可以這樣做:

[list(item) for item in combObj] 
+0

或'list(map(list,combObj))' –

+0

@Austin,map不返回Python3的列表。注意Python-3.x標籤 –

+0

@gnibbler,啊。謝謝!評論已刪除。 –

0

生成器很好,因爲它們不佔用太多內存。如果你使用它很多,並有內存然後將其保存爲一個元組而不是生成器。

否則,我經常做一個功能,我想用它每次返回發電機:

>>> def get_combObj(): 
...  return itertools.combinations(n,3) 
... 
>>> for i in get_combObj(): 
...  print list(i) 
... 
[1, 2, 3] 
[1, 2, 4] 
[1, 3, 4] 
[2, 3, 4] 

(你可以調用get_combObj(),只要你想盡可能多)