您将如何实现以下(在Python中):
List 1: qw,wq
现在在第一个元素之前和每个子集的每个元素后面添加e
List 2: eqw, qew, qwe, ewq, weq, wqe
毋庸置疑,这应该以一般方式构建,以便列表1可以是任何比例。
我在想一个递归,但是我的函数使用了许多if / elses并且不太好。
答案 0 :(得分: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:]
答案 1 :(得分: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']