将 itertools.product() 结果附加到 Python 中的变量

Append itertools.product() results to variable in Python

我正在尝试将每个可能的两位数组合附加到列表中每个字符串的末尾。

字符串各八个字符,数字应替换第七个和第八个字符。

我正在使用 itertools.product() 生成这些两位数的组合,但我不确定如何将这些组合附加到字符串。我尝试使用 join(),但它会将字符串夹在两个数字之间。

我的下一次尝试在下方,但没有成功,因为您无法连接 'str''itertools.product' 对象

for p in passwords:
    candidates += list(p[:6] + itertools.product(string.digits, string.digits))

所以,密码看起来像这样

['american', 'japanese']

输出应该是

['americ00', 'americ01', 'americ02', …, 'japane98', 'japane99']

如果我没理解错的话,您想为每个密码创建一个候选列表。在这种情况下,您可以使用类似下面的内容,其中替换只计算一次,并且所有候选值都是逗号分隔值:

import itertools
import string

candidates = []
replacements = ['%s%s' % (x, y) for x, y in itertools.product(string.digits, string.digits)]

list_of_l = ['american', 'japanese']
for l in list_of_l:
    candidates += [l[:6] + repl for repl in replacements]

>>> print candidates
['americ00', 'americ01', 'americ02', 'americ03', 'americ04', 'americ05', 'americ06', 'americ07', 'americ08', 'americ09', 'americ10',
'americ11', 'americ12', 'americ13', 'americ14', 'americ15', 'americ16', 'americ17', 'americ18', 'americ19', 'americ20', 'americ21',
'americ22', 'americ23', 'americ24', 'americ25', 'americ26', 'americ27', 'americ28', 'americ29', 'americ30', 'americ31', 'americ32',
'americ33', 'americ34', 'americ35', 'americ36', 'americ37', 'americ38', 'americ39', 'americ40', 'americ41', 'americ42', 'americ43',
'americ44', 'americ45', 'americ46', 'americ47', 'americ48', 'americ49', 'americ50', 'americ51', 'americ52', 'americ53', 'americ54',
'americ55', 'americ56', 'americ57', 'americ58', 'americ59', 'americ60', 'americ61', 'americ62', 'americ63', 'americ64', 'americ65',
'americ66', 'americ67', 'americ68', 'americ69', 'americ70', 'americ71', 'americ72', 'americ73', 'americ74', 'americ75', 'americ76',
'americ77', 'americ78', 'americ79', 'americ80', 'americ81', 'americ82', 'americ83', 'americ84', 'americ85', 'americ86', 'americ87',
'americ88', 'americ89', 'americ90', 'americ91', 'americ92', 'americ93', 'americ94', 'americ95', 'americ96', 'americ97', 'americ98',
'americ99', 'japane00', 'japane01', 'japane02', 'japane03', 'japane04', 'japane05', 'japane06', 'japane07', 'japane08', 'japane09',
'japane10', 'japane11', 'japane12', 'japane13', 'japane14', 'japane15', 'japane16', 'japane17', 'japane18', 'japane19', 'japane20',
'japane21', 'japane22', 'japane23', 'japane24', 'japane25', 'japane26', 'japane27', 'japane28', 'japane29', 'japane30', 'japane31',
'japane32', 'japane33', 'japane34', 'japane35', 'japane36', 'japane37', 'japane38', 'japane39', 'japane40', 'japane41', 'japane42',
'japane43', 'japane44', 'japane45', 'japane46', 'japane47', 'japane48', 'japane49', 'japane50', 'japane51', 'japane52', 'japane53',
'japane54', 'japane55', 'japane56', 'japane57', 'japane58', 'japane59', 'japane60', 'japane61', 'japane62', 'japane63', 'japane64',
'japane65', 'japane66', 'japane67', 'japane68', 'japane69', 'japane70', 'japane71', 'japane72', 'japane73', 'japane74', 'japane75',
'japane76', 'japane77', 'japane78', 'japane79', 'japane80', 'japane81', 'japane82', 'japane83', 'japane84', 'japane85', 'japane86',
'japane87', 'japane88', 'japane89', 'japane90', 'japane91', 'japane92', 'japane93', 'japane94', 'japane95', 'japane96', 'japane97',
'japane98', 'japane99']

注意 list 是一个 python 内置函数,所以不建议将其用作变量名,因此我使用 list_of_l 来区分。

因为你只是在数数,所以不需要产品这可以缩写为:

 lst = ['american', 'japanese']
 candidates = ['{}{:02d}'.format(e[:6], i) for e in lst for i in range(100)]

这与循环相似

candidates = []
for e in lst:
    for i in range(100):
        candidates.append('{}{:02d}'.format(e[:6], i))

如果出于某种原因真的想要产品:

['{}{}{}'.format(e[:6], i, j) for e in lst for i, j in itertools.product(string.digits, string.digits)]

这也可以推广到具有更多参数的产品

[e[:6] + ''.join(pr) for e in lst for pr in itertools.product(string.digits, string.digits, string.digits)]