Как выбрать список словарей с различными возможными комбинациями для нарезки изображений? - PullRequest
0 голосов
/ 15 января 2019

Я пытаюсь получить все значения из списка словарей так, чтобы он охватывал все возможные разные комбинации. например

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 разных пар Как я могу автоматизировать это, чтобы получить желаемые значения?

Ответы [ 2 ]

0 голосов
/ 15 января 2019

Этот код будет принимать данные вашего списка и создавать список, в котором будет храниться ваш img[b:d, a:c]:

where_you_start = 0
where_you_stop = 12
image = [img[0:0, 0:0] for i in range(where_you_start, where_you_stop)]  # Initialize list


for i in range(where_you_start, where_you_stop):
    img_data = {}
    for elem in list[i * 4:i * 4 + 4]:
        for key, value in elem.items():
            img_data[key] = value

    image[i] = img[img_data['b']:img_data['d'], img_data['a']:img_data['c']]


set1 = (image[1], image[2])
set2 = (image[1], image[3])
...
setn = (image[x], image[y])

where_you_start - это то место, с которого вы хотите создать img из данных в вашем list.

where_you_stop - это то место, где вы хотите остановиться.

Код перебирает ваш определенный диапазон и принимает четыре значения в списке: list[i * 4:i * 4 + 4] отвечает только за получение четырех значений.

Чтобы получить доступ к различным наборам, выберите разные элементы в списке image

0 голосов
/ 15 января 2019

Если вам нужны все возможные комбинации, вы можете использовать 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...