2012-01-08 83 views
2

我正在尋找一種方法進入列表並直接訪問其元素。例如,以下是獲取集合的笛卡爾積的一般方法。有沒有辦法在python中刪除列表?

>>> list(itertools.product((0,1), (0,1),(0,1),(0,1))) 
[(0, 0, 0, 0), (0, 0, 0, 1), (0, 0, 1, 0), (0, 0, 1, 1), (0, 1, 0, 0), (0, 1, 0, 1), (0, 1, 1, 0), (0, 1, 1, 1), (1, 0, 0, 0), (1, 0, 0, 1), (1, 0, 1, 0), (1, 0, 1, 1), (1, 1, 0, 0), (1, 1, 0, 1), (1, 1, 1, 0), (1, 1, 1, 1)] 

但是,在這種情況下,四組是相同的,並且它很快變得無聊和厭煩不得不一遍又一遍地鍵入它,這讓人想到這樣做,而不是:

>>> list(itertools.product([(0,1)]*4) 

但是當然它不起作用,因爲itertools.product函數會將它看作一組而不是四組。所以,問題是,有沒有辦法做到這一點:

>>> list(itertools.product(delist([(0,1)]*4)) 
+0

也許你應該考慮創建一些類或者一對類來封裝這些數據的細節,並將你想要在實例上執行的操作公開爲對象方法。 – 2012-01-08 07:19:43

回答

8
itertools.product((0,1), repeat=4) 

product函數接受一個optional repeat argument。以上相當於itertools.product((0, 1), (0, 1), (0, 1), (0, 1))


在一般情況下,如果你有一個清單

lst = [1, 2, 4, 6, 8, ...] 

,你想調用一個函數作爲

f(1, 2, 4, 6, 8, ...) 

你可以使用the * (unpack) operator展開列表了口角列表:

f(*lst) 
+0

所以他只需要添加*,即列表(itertools.product(* [(0,1)] * 4))雖然使用重複更好 – 2012-01-08 07:10:19

+0

這是令人尷尬的,我應該先閱讀文檔。這就是說,你的答案有一個小錯誤,應該是'itertools.product((0,1),repeat = 4)',仍然是一個有用的答案neverthless。謝謝。 – qed 2012-01-08 07:17:50

3

如果您未使用itertools.product,則也可以使用*運算符。 *運營商通過「刪除」來做我認爲你的意思。它將列表或其他可迭代對象的內容轉換爲函數的位置參數。一般來說:

args = ['arg1', 'arg2', 'arg3', 'arg4'] 

# The following two calls are exactly equivalent 
func('arg1', 'arg2', 'arg3', 'arg4') 
func(*args) 

在這個具體的例子中,代碼應該是這樣的:

itertools.product(*[(0,1)]*4) 

然而,以前的答案(由KennyTM)可能是在itertools.product具體情況吸塵器:

itertools.product((0, 1), repeat=4) 
相關問題