如何在 python 中动态分配参数给 itertools.product
How to dynamically assign arguments to itertools.product in python
我正在研究如何传递 itertools.product 动态数量的参数。
我有以下代码,它按预期打印出每行有 4 个字符的不同顺序的行:
#!/usr/bin/env python3.5
import sys, itertools, multiprocessing, functools
alphabet = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ12234567890!@#$%^&*?,()-=+[]/;"
num_parts = 4
part_size = len(alphabet) // num_parts
def do_job(first_bits):
for x in itertools.product(first_bits, alphabet, alphabet, alphabet):
print(''.join(x))
if __name__ == '__main__':
pool = multiprocessing.Pool(processes=4)
results = []
for i in range(num_parts):
if i == num_parts - 1:
first_bit = alphabet[part_size * i :]
else:
first_bit = alphabet[part_size * i : part_size * (i+1)]
pool.apply_async(do_job, (first_bit,))
pool.close()
pool.join()
然后我尝试使用以下代码使其完全动态,其中字母参数的数量是基于 num_parts 变量动态创建的:
#!/usr/bin/env python3.5
import sys, itertools, multiprocessing, functools
alphabet = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ12234567890!@#$%^&*?,()-=+[]/;"
num_parts = 4
part_size = len(alphabet) // num_parts
dynamicArgs = []
def do_job(first_bits):
for x in itertools.product(first_bits, *dynamicArgs):
print(''.join(x))
if __name__ == '__main__':
pool = multiprocessing.Pool(processes=4)
results = []
for x in range(num_parts-1):
dynamicArgs.append(alphabet)
for i in range(num_parts):
if i == num_parts - 1:
first_bit = alphabet[part_size * i :]
else:
first_bit = alphabet[part_size * i : part_size * (i+1)]
pool.apply_async(do_job, (first_bit,))
pool.close()
pool.join()
但这并没有像预期的那样工作...它输出每行一个字符的行,并且只遍历字母表一次。
如何将动态数量的字母变量作为参数传递给 itertools.product?
感谢您的宝贵时间。
这就是你想要做的吗?
import sys, itertools, multiprocessing, functools
alphabet = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ12234567890!@#$%^&*?,()-=+[]/;"
repeats = 5
alphabets = [ alphabet ] * repeats
def do_job(first_bits):
for x in itertools.product(first_bits, *alphabets):
print(''.join(x))
do_job('12345')
您可以在重复元素的数组上使用 *
运算符。
输出:
1aaaaa
1aaaab
1aaaac
1aaaad
1aaaae
1aaaaf
1aaaag
1aaaah
1aaaai
1aaaaj
1aaaak
[...]
您可以只乘以字符串列表:
def do_job(first_bits):
for x in itertools.product(first_bits, *[alphabet] * 3):
您也可以使用 itertools.repeat:
from itertools import repeat
def do_job(first_bits, times):
for x in itertools.product(first_bits, *repeat(alphabet, times)):
我正在研究如何传递 itertools.product 动态数量的参数。
我有以下代码,它按预期打印出每行有 4 个字符的不同顺序的行:
#!/usr/bin/env python3.5
import sys, itertools, multiprocessing, functools
alphabet = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ12234567890!@#$%^&*?,()-=+[]/;"
num_parts = 4
part_size = len(alphabet) // num_parts
def do_job(first_bits):
for x in itertools.product(first_bits, alphabet, alphabet, alphabet):
print(''.join(x))
if __name__ == '__main__':
pool = multiprocessing.Pool(processes=4)
results = []
for i in range(num_parts):
if i == num_parts - 1:
first_bit = alphabet[part_size * i :]
else:
first_bit = alphabet[part_size * i : part_size * (i+1)]
pool.apply_async(do_job, (first_bit,))
pool.close()
pool.join()
然后我尝试使用以下代码使其完全动态,其中字母参数的数量是基于 num_parts 变量动态创建的:
#!/usr/bin/env python3.5
import sys, itertools, multiprocessing, functools
alphabet = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ12234567890!@#$%^&*?,()-=+[]/;"
num_parts = 4
part_size = len(alphabet) // num_parts
dynamicArgs = []
def do_job(first_bits):
for x in itertools.product(first_bits, *dynamicArgs):
print(''.join(x))
if __name__ == '__main__':
pool = multiprocessing.Pool(processes=4)
results = []
for x in range(num_parts-1):
dynamicArgs.append(alphabet)
for i in range(num_parts):
if i == num_parts - 1:
first_bit = alphabet[part_size * i :]
else:
first_bit = alphabet[part_size * i : part_size * (i+1)]
pool.apply_async(do_job, (first_bit,))
pool.close()
pool.join()
但这并没有像预期的那样工作...它输出每行一个字符的行,并且只遍历字母表一次。
如何将动态数量的字母变量作为参数传递给 itertools.product?
感谢您的宝贵时间。
这就是你想要做的吗?
import sys, itertools, multiprocessing, functools
alphabet = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ12234567890!@#$%^&*?,()-=+[]/;"
repeats = 5
alphabets = [ alphabet ] * repeats
def do_job(first_bits):
for x in itertools.product(first_bits, *alphabets):
print(''.join(x))
do_job('12345')
您可以在重复元素的数组上使用 *
运算符。
输出:
1aaaaa
1aaaab
1aaaac
1aaaad
1aaaae
1aaaaf
1aaaag
1aaaah
1aaaai
1aaaaj
1aaaak
[...]
您可以只乘以字符串列表:
def do_job(first_bits):
for x in itertools.product(first_bits, *[alphabet] * 3):
您也可以使用 itertools.repeat:
from itertools import repeat
def do_job(first_bits, times):
for x in itertools.product(first_bits, *repeat(alphabet, times)):