Python:2个字符串的字符组合,同时保持位置

时间:2016-10-02 16:42:04

标签: python-3.x

我有两个字符串或单个字符的列表,并希望找到所有可能的组合 应在结果中保留原始字符串/列表中字符的位置。 原始字符串/列表具有相同的长度。

例如:

original_str1 = 'ABC'
original_str2 = 'DEF'

result = ['ABC','AEC','ABF','AEF','DBC','DEC','DBF','DEF']

因此,仅限位置1' A'或者' D'是允许的,' B'或者' E'对于位置2和' C'或者' F'第3位。

实现这一目标的最佳方法是什么?

2 个答案:

答案 0 :(得分:1)

itertools.product可以帮助您:

from itertools import product
result = [''.join(l) for l in product(*zip('ABC', 'DEF'))]
desired_output = ['ABC','AEC','ABF','AEF','DBC','DEC','DBF','DEF']
assert set(result) == set(desired_output)

尽可能多地使用标准库。它通常速度快,写得很好,可以简化代码。

这是@trincot对stdlib与聪明纯Python代码的简单计时测试(我使用IPython):

In [1]: original_str1 = 'ABC'
   ...: original_str2 = 'DEF'
   ...: n = len(original_str1)
   ...: s = [original_str1, original_str2]
   ...:

In [2]: %timeit [''.join([s[(i>>j)&1][j] for j in range(0, n)]) for i in range(0, 2**n)]
100000 loops, best of 3: 11.8 µs per loop

In [3]: from itertools import product

In [4]: %timeit [''.join(l) for l in product(*zip('ABC', 'DEF'))]
100000 loops, best of 3: 2.62 µs per loop

正如您所看到的,stdlib的速度提高了4.5倍,并且更容易理解。

答案 1 :(得分:0)

这是一个没有itertools的解决方案:

n = len(original_str1)
s = [original_str1, original_str2]

result = [''.join([s[(i>>j)&1][j] for j in range(0, n)]) for i in range(0, 2**n)]