首页 > 解决方案 > 如何为图像切片选择具有不同可能组合的字典列表?

问题描述

我正在尝试从字典列表中获取所有值,以便它应该涵盖所有可能的不同组合。例如

list = [{'a': 32}, {'b': 2541}, {'c': 530}, {'d': 55}, {'a': 544}, {'b': 44}, {'c': 54}, {'d': 454}, {'a': 42}, {'b': 655}, {'c': 459}, {'d': 665}, {'a': 2145}, {'b': 450}, {'c': 342}, {'d': 186}, ........]

我想一次选择两对,如下所示

image1 = img[2541:55, 32:530]
image2 = img[44:454, 544:54]

我也想用所有其他可能的组合来做到这一点

image1 = img[2541:55, 32:530]
image2 = img[655:665, 42:459]

像这样我可以做 12 对不同的配对,我怎样才能自动化它以获得所需的值?

标签: pythonpython-3.xlistdictionary

解决方案


如果您想要所有可能的组合,您可以使用itertools.product.

第一步是重新排列所有可能的值'a', 'b', 'c' and 'd'。假设您的列表每 4 步重复一次,为了清楚起见,您可以放入字典,如下所示:

l1 = {k: [e.get(k) for e in your_list][i::4] for i, k in enumerate(['a', 'b', 'c', 'd'])}
l1
>> 
{'a': [32, 544, 42, 2145],
 'b': [2541, 44, 655, 450],
 'c': [530, 54, 459, 342],
 'd': [55, 454, 665, 186]}

然后:

from itertools import product
combinations = [c for c in product(*l1.values())]
combinations
>>[(32, 2541, 530, 55),
 (32, 2541, 530, 454),
 (32, 2541, 530, 665),
 (32, 2541, 530, 186)
....
 (2145, 450, 342, 186)]   #256 combinations in this case (4**4)

推荐阅读