2015-02-08 4 views
1

Я пытаюсь добавить каждую возможную двухзначную комбинацию в конец каждой строки в списке.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'] 
+1

Как выглядит 'l' и ваш' list'? И что вы пытаетесь сделать, добавив это кандидатам на каждой итерации? –

+0

Список содержит пароли кандидатов, поэтому каждый из них представляет собой всего лишь восьмисимвольную строку. Я хочу, чтобы эти новые комбинации символов/цифр были добавлены в список кандидатов. – Josephus

+0

Пожалуйста, напишите минимальный пример данных * input * и ожидаемого результата. Если '' 'list''' содержит одну строку, сколько строк будет в результате? Пожалуйста, избегайте использования ключевых слов и названий функций Python в качестве имен ваших переменных. – wwii

ответ

2

Поскольку вы просто подсчет, продукт не является необходимым Это может быть сокращено до:

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

Что alanalgous к петле

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)] 
+1

Я думаю, что у вас слишком много string.digits, вы также можете использовать repeat '[ele [: 6] +" ". Join (tup) для ele в паролях для tup в продукте (цифры, повтор = 2)]' –

1

Если я понять это правильно, вы хотите создать список кандидатов для каждого пароля , в этом случае, вы могли бы использовать что-то вроде ниже, где замены вычисляются только один раз, и все кандидаты должны быть разделены запятой значения:

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 является питон встроенной, поэтому не рекомендуется использовать это как переменное имя и, следовательно, я использовал list_of_l для дифференциации.