创建字符串的变体
Create variations of a string
我生成了每个 16 个字符的随机字符串,并使用以下方法将它们添加到列表中:
import random
strings = []
for x in range(0, 99):
strings.append(''.join(random.choice('0123456789ABCDEF') for i in range(16)))
这按预期工作。现在,对于每个生成的字符串,我想找到所有可能的组合,这样至少有两个字符与原始字符串保持相同,并且字符的顺序不会改变。例如,如果我们有 CDD733665417E3F1,那么我想生成所有 CDXXXXXXXXXXXXXXXX,其中 X 可以是任何东西(0-9 或 A-F)。同样是XXD7XXXXXXXXXXXX等等。以前的类似问题暗示使用 itertools.product
但我不确定如何使用它来生成排列而不是固定替换。任何帮助将不胜感激。谢谢
使用 itertools.combinations
为您希望保持不变的两个字符的索引创建一个迭代器
>>> from itertools import combinations
>>> s = 'ABC123'
>>> for indices in combinations(range(len(s)), 2):
... print ''.join([s[x] if x in indices else 'X' for x in range(len(s))])
...
ABXXXX
AXCXXX
AXX1XX
AXXX2X
AXXXX3
XBCXXX
XBX1XX
XBXX2X
XBXXX3
XXC1XX
XXCX2X
XXCXX3
XXX12X
XXX1X3
XXXX23
创建所有变量字符串。
然后您可以执行嵌套循环来替换 X
。
然后您可以使用 product
来获取所有您需要用 X
替换的字母:
>>> for letters in product('ABCDEF0123456789', repeat = 4):
... print letters
...
('A', 'A', 'A', 'A')
('A', 'A', 'A', 'B')
('A', 'A', 'A', 'C')
('A', 'A', 'A', 'D')
('A', 'A', 'A', 'E')
('A', 'A', 'A', 'F')
('A', 'A', 'A', '0')
('A', 'A', 'A', '1')
('A', 'A', 'A', '2')
('A', 'A', 'A', '3')
('A', 'A', 'A', '4')
('A', 'A', 'A', '5')
('A', 'A', 'A', '6')
('A', 'A', 'A', '7')
('A', 'A', 'A', '8')
('A', 'A', 'A', '9')
('A', 'A', 'B', 'A')
('A', 'A', 'B', 'B')
('A', 'A', 'B', 'C')
('A', 'A', 'B', 'D')
('A', 'A', 'B', 'E')
('A', 'A', 'B', 'F')
('A', 'A', 'B', '0')
('A', 'A', 'B', '1')
('A', 'A', 'B', '2')
.
.
.
将这些组合在一起,你会得到你想要的所有组合。
你或许可以这样做:
>>> for indices in combinations(range(len(s)), 2):
... for letters in product('ABCDEF0123456789', repeat = 4):
... letter_iter = iter(letters)
... print ''.join([s[x] if x in indices else letter_iter.next() for x in range(len(s))])
注意 1:您可以在 combinations
的调用中更改 2
以更改您希望保持不变的索引数量。同样,您可以更改产品调用中的 repeat
参数以反映这些更改(repeat = n
其中 n = len(s) - number_in_combinations
)
注意 2:这些值的数量多得惊人。你知道这个。请小心不要破坏你的记忆。当我执行 product
调用时,我添加了一个索引计数器并在索引计数器大于 20 后中断循环以避免崩溃。
我生成了每个 16 个字符的随机字符串,并使用以下方法将它们添加到列表中:
import random
strings = []
for x in range(0, 99):
strings.append(''.join(random.choice('0123456789ABCDEF') for i in range(16)))
这按预期工作。现在,对于每个生成的字符串,我想找到所有可能的组合,这样至少有两个字符与原始字符串保持相同,并且字符的顺序不会改变。例如,如果我们有 CDD733665417E3F1,那么我想生成所有 CDXXXXXXXXXXXXXXXX,其中 X 可以是任何东西(0-9 或 A-F)。同样是XXD7XXXXXXXXXXXX等等。以前的类似问题暗示使用 itertools.product
但我不确定如何使用它来生成排列而不是固定替换。任何帮助将不胜感激。谢谢
使用 itertools.combinations
>>> from itertools import combinations
>>> s = 'ABC123'
>>> for indices in combinations(range(len(s)), 2):
... print ''.join([s[x] if x in indices else 'X' for x in range(len(s))])
...
ABXXXX
AXCXXX
AXX1XX
AXXX2X
AXXXX3
XBCXXX
XBX1XX
XBXX2X
XBXXX3
XXC1XX
XXCX2X
XXCXX3
XXX12X
XXX1X3
XXXX23
创建所有变量字符串。
然后您可以执行嵌套循环来替换 X
。
然后您可以使用 product
来获取所有您需要用 X
替换的字母:
>>> for letters in product('ABCDEF0123456789', repeat = 4):
... print letters
...
('A', 'A', 'A', 'A')
('A', 'A', 'A', 'B')
('A', 'A', 'A', 'C')
('A', 'A', 'A', 'D')
('A', 'A', 'A', 'E')
('A', 'A', 'A', 'F')
('A', 'A', 'A', '0')
('A', 'A', 'A', '1')
('A', 'A', 'A', '2')
('A', 'A', 'A', '3')
('A', 'A', 'A', '4')
('A', 'A', 'A', '5')
('A', 'A', 'A', '6')
('A', 'A', 'A', '7')
('A', 'A', 'A', '8')
('A', 'A', 'A', '9')
('A', 'A', 'B', 'A')
('A', 'A', 'B', 'B')
('A', 'A', 'B', 'C')
('A', 'A', 'B', 'D')
('A', 'A', 'B', 'E')
('A', 'A', 'B', 'F')
('A', 'A', 'B', '0')
('A', 'A', 'B', '1')
('A', 'A', 'B', '2')
.
.
.
将这些组合在一起,你会得到你想要的所有组合。
你或许可以这样做:
>>> for indices in combinations(range(len(s)), 2):
... for letters in product('ABCDEF0123456789', repeat = 4):
... letter_iter = iter(letters)
... print ''.join([s[x] if x in indices else letter_iter.next() for x in range(len(s))])
注意 1:您可以在 combinations
的调用中更改 2
以更改您希望保持不变的索引数量。同样,您可以更改产品调用中的 repeat
参数以反映这些更改(repeat = n
其中 n = len(s) - number_in_combinations
)
注意 2:这些值的数量多得惊人。你知道这个。请小心不要破坏你的记忆。当我执行 product
调用时,我添加了一个索引计数器并在索引计数器大于 20 后中断循环以避免崩溃。