2016-07-19 3 views
0

У меня есть 15 dicts, как следующие 3 (все 15 имеют разную длину). Например:Сочетания нескольких dicts python

HQDict = {'HQ1':10, 'HQ2':3, 'HQ3':5} 
BADict = {'BA1':15, 'BA2':4, 'BA3':3} 
STDict = {'ST1':5, 'ST2':4, 'ST3':3} 

Я хочу, чтобы создать все возможные комбинации 15 dicts только с одним элементом, выбранным из каждого Словаря со значениями суммироваться, и ключами, хранящихся в списке. Я смог получить всю информацию в соответствующих dicts, но я не знаю, с чего начать с комбинаций, я видел itertools.combinations, но я не уверен, как сделать это, только выберите один элемент из каждого dict. Если вам нужна дополнительная информация, пожалуйста, спросите, и я с удовольствием отредактирую.

Edit1: Я также необходимо добавить, что значения являются аддитивными, так значение BA2 будет значение БА1 + BA2 и что комбинация может быть список 1.

list=[HQ1,BA2,ST1] 
value=34 

next permutation 
list=[HQ2] 
value=13 

Edit2:

Вместо того, чтобы пытаться создать комбинации dicts, конечной целью является дать функции общее количество и она вернет все возможные комбинации зданий (каждый dict представляет собой здание и каждый элемент в dict level), которые добавляют до этого. Так, например:

combinations(34) would return 
[HQ1,BA2,ST1] 
and combinations(13 would return 
[HQ2] 

Pastebin в файл, содержащий все здания и код им с помощью создать dicts: link to pastebin

+1

Это выглядит очень похоже на [проблему рюкзака] (https://en.wikipedia.org/wiki/Knapsack_problem) –

+0

Спасибо за ссылку, когда я начал смотреть вокруг проблема ранца Я тогда нашел проблему подмножества сумм, и это выглядело больше, чем я был, поскольку проблема с рюкзаком искала оптимальные решения, однако я был после точных решений. https://en.m.wikipedia.org/wiki/Subset_sum_problem –

ответ

2

я видел itertools.combinations, но я не знаю, как сделать это только выберите 1 элемент из каждого dict.

Используйте вместо этого itertools.product(..). Он принимает изменяющийся список аргументов, каждый из которых соответствует списку опций, чтобы выбрать в одной итерации:

>>> map(dict, product(HQDict.items(), STDict.items(), BADict.items())) 
[{'HQ1': 10, 'BA2': 4, 'ST1': 5}, {'HQ1': 10, 'ST1': 5, 'BA3': 3}, ...... ] 

Если у вас есть 15 таких dicts, я предложил бы положить все из них в списке, и называя продукт, как ниже:

>>> map(dict, product(*list_of_dicts)) 

EDIT: в Python3, вы получите объект карты обратно, и вам придется перебрать его, чтобы получить фактические значения. Вы можете преобразовать его в список, но победите цель карты, возвращающей то, что вы можете перебрать. Вы можете конвертировать в список, как:

>>> [dict(x) for x in product(HQDict.items(), STDict.items(), BADict.items())] 
[{'HQ1': 10, 'BA2': 4, 'ST1': 5}, {'HQ1': 10, 'ST1': 5, 'BA1': 15}, ..] 
+0

спасибо, я дам ему сейчас –

+0

Я пытаюсь использовать этот http://pastebin.com/JZAaMJxM, но он просто возвращает пустой dict? –

+0

Не знаю. Как вы видите в выводе выше. Можете ли вы поднять минимальный проверяемый полный пример? – SuperSaiyan

Смежные вопросы