2013-09-24 44 views
3

我有一個列表,我想通過在所有可能的位置添加x 1和0來創建所有列表。例如,假設X = 2和在所有可能的位置添加位

l=[0,1] 

首先,我們只需將長度爲2的所有可能的名單在開始給予[0,0,0,1][0,1,0,1][1,0,0,1][1,1,0,1]。然後我們在開始處放置0或1,在位置2放置0或1,給出[0,0,0,1],[0,0,1,1],[1,0,0,1],[1,0,1,1]

然後,我們可以爲列表中可插入兩位的每個可能的位置對執行相同的操作。當然會有很多重複,但我可以使用set刪除那些重複。

又如,此時,其中x = 1

l=[1,1] 

完整輸出應該[0,1,1], [1,0,1], [1,1,0], [1,1,1]

有沒有一個聰明的方法來做到這一點?

+0

你能請註明這個數組有什麼'x'的意思?它看起來像它的意圖,以增加它,但你的例子結果說不然。 – Serdalis

+0

@Serdalis x只是說你需要添加多少個1或0。 – felix

+0

有'x = 2'和一個數組而不是x = 4的具體原因嗎? – Serdalis

回答

3

IIUC,你可以使用這樣的事情:

from itertools import product, combinations 

def all_fill(source, num): 
    output_len = len(source) + num 
    for where in combinations(range(output_len), len(source)): 
     # start with every possibility 
     poss = [[0,1]] * output_len 
     # impose the source list 
     for w, s in zip(where, source): 
      poss[w] = [s] 
     # yield every remaining possibility 
     for tup in product(*poss): 
      yield tup 

這給

>>> set(all_fill([1,1], 1)) 
set([(0, 1, 1), (1, 1, 0), (1, 1, 1), (1, 0, 1)]) 
>>> set(all_fill([0,1], 2)) 
set([(1, 0, 1, 1), (1, 1, 0, 1), (1, 0, 1, 0), (0, 1, 1, 1), 
(0, 1, 0, 1), (1, 0, 0, 1), (0, 0, 1, 0), (0, 1, 1, 0), 
(0, 1, 0, 0), (0, 0, 1, 1), (0, 0, 0, 1)]) 
+0

打敗我吧,做好工作。 – Serdalis

1

我想你想要的是itertools.product

import itertools 
x = 2 
l = [0, 1] 
print list(itertools.product(l + [0, 1], repeat=len(l)+x)) 
+0

我添加了另一個更簡單的例子。你的代碼給出(0,0,0),例如l = [1,1]和x = 1,這不是我想要的。 – felix

1
# input 
l=[1,1] 
x=1 

# create bit combinations that may be added to l 
import itertools 
combos = itertools.product([0,1], repeat=x) 

# iterate through positions (k) and bit combinations (c) with 
# a single generator expression. Might be more memory efficient 
# if combos would only be generated directly here 
set(tuple(l)[:k] + c + tuple(l)[k:] for c in combos for k in range(len(l)+1)) 

# returns 
# set([(0, 1, 1), (1, 1, 1), (1, 1, 0), (1, 0, 1)]) 
+0

這將不會產生像'(1,0,1,0)'這樣的輸出,其中插入是在兩側,或者更一般地是插入不連續的情況。 – DSM