python - 创建字符串的变体

标签 python string python-itertools

我生成了每个 16 个字符的随机字符串,并使用以下命令将它们添加到列表中:

import random
strings = []
for x in range(0, 99): 
 strings.append(''.join(random.choice('0123456789ABCDEF') for i in range(16)))

这按预期工作。现在,对于每个生成的字符串,我想找到所有可能的组合,使得至少两个字符与原始字符串保持相同并且字符的顺序不改变。例如,如果我们有 CDD733665417E3F1,那么我想生成所有 CDXXXXXXXXXXXXXXX,其中 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 参数以反射(reflect)这些更改(repeat = n,其中 n = len(s) - number_in_combinations)

注 2:这些数值大得愚蠢。你知道这个。请注意不要破坏你的内存。当我执行 product 调用时,我添加了一个索引计数器,并在索引计数器大于 20 后中断循环,以避免陷入困惑。

关于python - 创建字符串的变体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38746525/

相关文章:

python - 如何使用Python图像库(PIL)突出显示图像的一部分?

python - "pip3 install numpy"在酿造的 Python 3.5 上失败

javascript - 如何根据从字符串中提取的名称在运行时创建变量?

ruby - 获取ruby中所有字符的索引

java - 需要帮助处理 json 格式的字符串。 ( java )

python - 通过 Pillow 的 Image.frombytes 创建的图像与预期不同

python - 如何在Python中有效地从n个元素的集合列表中生成n+1个元素的集合列表?

python - 如何将列表中的相似项目分组?

Python & Numpy - 创建动态的、任意的 ndarray 子集

python - 使用 Python 3.5 安装 numpy Windows 8 64