你將如何實現以下(在Python):創建一套新的子集的出子集集合(蟒蛇)的
List 1: qw,wq
的第一個元素的每個子集的每一個元素之前和之後現在加測e
List 2: eqw, qew, qwe, ewq, weq, wqe
不用說,這應該在一般的方式來構造,使表1可以任意比例。
我想遞歸的,但還沒有我的功能使用了很多,如果/別人的,不是太好。
你將如何實現以下(在Python):創建一套新的子集的出子集集合(蟒蛇)的
List 1: qw,wq
的第一個元素的每個子集的每一個元素之前和之後現在加測e
List 2: eqw, qew, qwe, ewq, weq, wqe
不用說,這應該在一般的方式來構造,使表1可以任意比例。
我想遞歸的,但還沒有我的功能使用了很多,如果/別人的,不是太好。
這可能工作:
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:]
不要用enumerate在(x)範圍就足夠了;) –
@StevenRumbalski夠正確的。我會相應地編輯。 – Hyperboreus
工作,我甚至沒有收益管理。 – nottinhill
在一個稍微清潔的方式使用發電機
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']
爲什麼不發佈您自己的解決方案而不是鍍金礦? – Hyperboreus
我真的不想使用發電機。另外一個嵌套循環會產生n^2的數量級,沒有什麼特別值得驕傲的。另外,爲什麼你的函數名稱叫做silly_op? – nottinhill
要回答這裏的批評: 1.的確,不需要使用發電機。 2.我的代碼與先前的答案有相同的循環量 3.沒有n^2循環,有nm循環,因爲生成的列表包含n * m個元素,所以無法做到這一點。 –
設置或列表? – Hyperboreus
選擇你喜歡的。 – nottinhill
集合是無序的,因此是問題。我已經發布了一個與列表的答案。 – Hyperboreus