假设我有一个图像列表['1.jpg', '2.jpg', '3.jpg'...]和相应的垂直尺寸列表[200, 400, 300...]我试图返回图像列表的所有排列,其中大小位于相邻元素的10%之内.这被证明是非常具有挑战性的!
我首先尝试itertools.permutations了整个列表,然后遍历每个元素并检查其有效性.这很有效,但是当n > 12它显然变得非常慢时,从一开始就产生如此多的无效排列似乎效率低下.
然后我意识到顺序并不是特别重要,因为图像将在循环中显示,所以我修复了列表中的第一个元素,但这仍然需要我置换每个元素,所以再次,低效.
然后我去寻找另一种方法,并决定试试这个:
images = ['1.jpg', '2.jpg', '3.jpg', '4.jpg', '5.jpg']
v_size = [100, 125, 110, 120, 95]
pairs = list(itertools.permutations(images,2))
Run Code Online (Sandbox Code Playgroud)
这产生了所有可能的图像配对的列表,然后我可以验证并过滤到仅满足+/- 10%标准的对,因此我最终留下了满足我的标准的以下有效配对集:
[('1.jpg', '3.jpg'), ('1.jpg', '5.jpg'), ('2.jpg', '4.jpg'), ('3.jpg', '1.jpg'), ('3.jpg', '4.jpg'), ('4.jpg', '2.jpg'), ('4.jpg', '3.jpg'), ('5.jpg', '1.jpg')]
Run Code Online (Sandbox Code Playgroud)
检查它,似乎有道理.因此,图像1和3可以彼此相邻,因此3和4,4和2等也是如此.所以我想要生成的是这些的重新组合以找到原始图像的所有(如果有的话)有效排列.例如:
['5.jpg', '1.jpg', '3.jpg', '4.jpg', '2.jpg']
Run Code Online (Sandbox Code Playgroud)
将是一个有效的安排,而:
['1.jpg', '2.jpg', '3.jpg', '4.jpg', '5.jpg']
Run Code Online (Sandbox Code Playgroud)
不会,因为图像大小超出了彼此10%的大小限制.
我考虑过递归,但我对此很新,不知道从哪里开始.
非常感谢有关如何解决这个问题的任何建议,因为我已经尝试了好几天!