如果我有一个宽度x高度像素的图像,我想编写一个函数,该函数返回(宽度,高度)tupel列表,并以可能的方式重新排列这些像素。
例如,如果图像为87 * 87像素,我可以将宽度和高度分解为素数列表:
[3,3,29,29]
现在,我想编写一个函数,以所有可能的方式将这些素数以2组为一组,以返回如下内容:
[(3,3 * 29 * 29), (29,3 * 3 * 29), (3 * 3、29 * 29), (29 * 29、3 * 3), (3 * 29、3 * 29), (3 * 3 * 29,29), (3 * 29 * 29,3)]
为了清楚起见,我没有将素数相乘。现在,我手动执行此操作,但我希望有一个函数来执行此操作。而且,即使使用itertools,我也没有找到在Python中执行此操作的简便方法。
例如,这将打印列表l中的3的组合:
l = [3, 3, 29, 29]
for t in itertools.groupby(itertools.combinations(l, 3)):
print(t[0])
但是并不能真正分辨出第四个元素是哪个,而每个组合中都没有。
有人能从素数列表中计算出所有可能的2元组吗?在每个元组中,必须在逗号的两侧使用所有素数。最好不要重复(在我的示例中就是groupby)。
答案 0 :(得分:2)
比您尝试使用主要因子要容易。
a = 87*87
print([(x, a//x) for x in range(1, 1+int(math.sqrt(a))) if a % x == 0])
输出:
[(1, 7569), (3, 2523), (9, 841), (29, 261), (87, 87)]
当然,除了正方形(如果有正方形)之外,还需要翻转每种可能的大小的宽度和高度。
即使您具有巨大的纹理(例如16384x16384),也基本上是即时的。