Я сталкиваюсь со следующей проблемой, у меня есть словарь Python, подобный следующему:
total = 30
companies = {
'a': 30,
'b': 7,
'c': 21,
'd': 5,
'e': 5,
etc
}
Я пытаюсь сделать так, чтобы группы компаний складывались так, чтобы цифры составляли общее количество.В этом примере я хочу получить следующий вывод:
group1 = {
'a':30
}
group2 = {
'c': 21,
'b': 7
}
group3 = {
'd': 5,
'e': 5
}
Если значение ключа в словаре равно> total, то будет создана группа, содержащая только это значение key: value.Например, если бы у нас было
companies = {
'a': 30,
'b': 7,
'c': 21,
'd': 5,
'e': 5,
'f': 32
etc
}
group1 = {
'f':32
}
etc
Я искал различные способы реализации этого, лучше всего я нашел бы Рюкзак, но этот алгоритм принял бы в качестве входного веса, значение, только как int.Также я нашел этот интересный модуль:
https://developers.google.com/optimization/bin/knapsack
from __future__ import print_function
from ortools.algorithms import pywrapknapsack_solver
def main():
# Create the solver.
solver = pywrapknapsack_solver.KnapsackSolver(
pywrapknapsack_solver.KnapsackSolver.
KNAPSACK_DYNAMIC_PROGRAMMING_SOLVER,
'test')
weights = [[565, 406, 194, 130, 435, 367, 230, 315, 393,
125, 670, 892, 600, 293, 712, 147, 421, 255]]
capacities = [850]
values = weights[0]
solver.Init(values, weights, capacities)
computed_value = solver.Solve()
packed_items = [x for x in range(0, len(weights[0]))
if solver.BestSolutionContains(x)]
packed_weights = [weights[0][i] for i in packed_items]
print("Packed items: ", packed_items)
print("Packed weights: ", packed_weights)
print("Total weight (same as total value): ", computed_value)
if __name__ == '__main__':
main()
Я пытался изменить этот алгоритм для работы со словарем (особенно со строкой), но безуспешно.
Есть ли лучший способ достичь этого результата?
Спасибо,