在字符串中生成不同的排列/组合

时间:2016-12-27 08:15:44

标签: regex string python-2.7

给我一​​个字符串(例如" 12345678")。 我想使用+-*/生成不同的组合。 喜欢:

'1+2+3+4+5+6+7+8'
'1+2*3-4+5+6-7+8'
'1-2+3+4*5+6-7*8'
'1-2-3-4+5*6+7+8'
'1+2+3+4+5+6*7*8'
'1-2+3-4+5-6+7-8'

我知道如何生成上述所有不同的组合?

1 个答案:

答案 0 :(得分:2)

这是实现这一目标的一种方法:

from itertools import product

numbers = "123456"
for operators in product('+-*/', repeat=len(numbers)-1):
    ret = numbers[0]
    for op, n in zip(operators, numbers[1:]):
        ret += op+n
    print(ret)

zip创建两个迭代器的元素对。其余的只是字符串操作(并没有很好的方式)。

这是一个更紧凑(和pythonic?)有更多itertools魔法:

from itertools import product, zip_longest, chain

numbers = "123456"
operators = '+-*/'
for ops in product(operators, repeat=len(numbers)-1):
    print(''.join(chain(*zip_longest(numbers, ops, fillvalue=''))))

product已有详细记录。使用zip_longest我创建一个迭代器,它将产生对('1', '+') , ('2', '*'), ... , ('6', '')(最后一项填充fillvalue; ops是一个比numbers短的元素。 chain(*...)成语是一种简单的方法来展平元组以获得字符串'1', '+', '2', '*', ..., '6', ''上的迭代器。那么我只是join这些字符串。

如果您不喜欢chain(*...)部分,则可以将其替换为chain.from_iterable(...)(这次没有可能更清洁的*