我有两个字符串或单个字符的列表,并希望找到所有可能的组合 应在结果中保留原始字符串/列表中字符的位置。 原始字符串/列表具有相同的长度。
例如:
original_str1 = 'ABC'
original_str2 = 'DEF'
result = ['ABC','AEC','ABF','AEF','DBC','DEC','DBF','DEF']
因此,仅限位置1' A'或者' D'是允许的,' B'或者' E'对于位置2和' C'或者' F'第3位。
实现这一目标的最佳方法是什么?
答案 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)]