从子集集中创建新的子集集(python)

时间:2014-04-01 20:16:46

标签: python algorithm

您将如何实现以下(在Python中):

List 1: qw,wq

现在在第一个元素之前和每个子集的每个元素后面添加e

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

毋庸置疑,这应该以一般方式构建,以便列表1可以是任何比例。

我在想一个递归,但是我的函数使用了许多if / elses并且不太好。

2 个答案:

答案 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']