2014-04-01 74 views
0

你將如何實現以下(在Python):創建一套新的子集的出子集集合(蟒蛇)的

List 1: qw,wq 

的第一個元素的每個子集的每一個元素之前和之後現在加測e

List 2: eqw, qew, qwe, ewq, weq, wqe 

不用說,這應該在一般的方式來構造,使表1可以任意比例。

我想遞歸的,但還沒有我的功能使用了很多,如果/別人的,不是太好。

+0

設置或列表? – Hyperboreus

+0

選擇你喜歡的。 – nottinhill

+0

集合是無序的,因此是問題。我已經發布了一個與列表的答案。 – Hyperboreus

回答

3

這可能工作:

a = ['qw', 'wq', 'test'] 

def merge (tgt, letter): 
    for i, _ in enumerate (tgt): 
     yield tgt [:i] + letter + tgt [i:] 
    yield tgt + letter 

b = [x for tgt in a for x in merge (tgt, 'e') ] 
print (b) 

它打印

['eqw', 'qew', 'qwe', 'ewq', 'weq', 'wqe', 'etest', 'teest', 'teest', 'teset', 'teste'] 

我希望這是預期的結果。


或者考慮到史蒂芬的輸入:

def merge (tgt, letter): 
    for i in range (len (tgt) + 1): 
     yield tgt [:i] + letter + tgt [i:] 
+0

不要用enumerate在(x)範圍就足夠了;) –

+0

@StevenRumbalski夠正確的。我會相應地編輯。 – Hyperboreus

+0

工作,我甚至沒有收益管理。 – nottinhill

2

在一個稍微清潔的方式使用發電機

elements = ['qw', 'wq'] 

def silly_op(lst, char): 
    for e in lst: 
     for i in range(len(e) + 1): 
      yield e[:i] + char + e[i:] 

print(list(silly_op(elements, 'e'))) 

打印

['eqw', 'qew', 'qwe', 'ewq', 'weq', 'wqe'] 

沒有遞歸,沒有如果,只有2個嵌套升哎呀+發電機。

當然,如果你想要得到的結果列表,你可以寫

def silly_op(lst, char): 
    rv = [] 

    for e in lst: 
     for i in range(len(e) + 1): 
      rv.append(e[:i] + char + e[i:]) 

    return rv 

或者,如果問題是關於置換,通過@AdamSmith的建議,

print(list(''.join(i) for i in itertools.permutations('wq' + 'e'))) 

打印

['wqe', 'weq', 'qwe', 'qew', 'ewq', 'eqw'] 
+0

爲什麼不發佈您自己的解決方案而不是鍍金礦? – Hyperboreus

+0

我真的不想使用發電機。另外一個嵌套循環會產生n^2的數量級,沒有什麼特別值得驕傲的。另外,爲什麼你的函數名稱叫做silly_op? – nottinhill

+0

要回答這裏的批評: 1.的確,不需要使用發電機。 2.我的代碼與先前的答案有相同的循環量 3.沒有n^2循環,有nm循環,因爲生成的列表包含n * m個元素,所以無法做到這一點。 –