使用数据类和字典来解决“盒子问题”

时间:2018-10-30 02:00:58

标签: python dictionary python-dataclasses

该项目是使用特定算法将项目分类到框中。我在使用字典将项作为值放入给定框中时遇到麻烦。我的主要问题是,当字典中有多个值时,我不知道如何检索键中的1个值。我的第二个问题是,我担心我会使程序过于复杂并创建不必要的功能。

我在使用此功能时特别麻烦:

def roomiest(boxList, itemList, boxDict, itemDict):
    """
    For each item find the box with the greatest remaining allowed weight that can support the item and place the item in that box
    :param boxList: The sorted list of boxes( large to small )
    :param itemList: The sorted list of items ( large to small )
    :param boxDict: Dict w/ boxes
    :param itemDict: Dict w/ items
    :return: If boxes were able to fit all items(1); items in box with individual weights(2); Box name with max
    weight(3); items with their weights that were left behind(4)
    """
    sortedItems = sortLargest2Small(itemList)
    sortedBoxes = sortLargest2Small(boxList)

    for item in sortedItems:
        for box in sortedBoxes:
            itemWeight = keywordSearchDict(item, itemDict)
            boxRemWeight = keywordSearchDict(box, boxDict)
            if itemWeight <= boxRemWeight:
                itemDict[
                    box] =  # Need to add item to box with its weight as well as modify the remaining weight the box 
                            # can hold

对于上下文,here is my code

这是文本文件的示例:pastebin

2 个答案:

答案 0 :(得分:0)

我认为您正在寻找字典.get().update()。很难说出函数的输入是什么样,但是这里有一些注意事项:

itemDictBox = {}

for item in sortedItems:
    for box in sortedBoxes:
        itemWeight = itemDict.get(item, 0)
        boxRemWeight = boxDict.get(box, 0)
        if itemWeight <= boxRemWeight:
            itemDictBox.update(box)

您确实有许多可以简化的额外代码。如果您以文本形式存储值,则可以使用','.join(some_list)使用逗号定界符,并使用some_string.split(',')转换回列表。

如果没有嵌套的for循环,函数的性能也会更好。看来您可以只遍历所有项目或盒子,或者只是拥有以重量为键的字典。

答案 1 :(得分:0)

如果itemListboxList已经排序,则无需再次对其进行排序。另外,由于(据我所知)boxList只是boxDict的值列表,而itemList只是itemDict的值列表,不需要(boxListitemList)或(boxDictitemDict)中的一个。

Python中的字典按定义是未排序和不可排序的。它们也不特别适合于反向查找(从值中检索键)。

我可能还会将“剩余重量”作为每个盒子的变量,而不是累积重量。

真正做到这一点的最佳方法可能是构建一个class Box(),因为应该对这些框进行命名,并跟踪其中包含的项目。此代码将给您(1)和(4)您的目标。对于(2)和(3),您可以创建一个自定义Box()类;为此,您可以定义自定义__lt__等参数。如果您查看sorted()函数,也可以使用字典;问题在于您随后必须查找与最小值关联的字典键。

boxWeight = 50
numBoxes = 5
boxList = [boxWeight for _ in range(0, numBoxes)]
itemList = [1, 10, 5, 25, 8, 74]
print("boxList: {}".format(boxList))
remainingItems = []
itemsRemain = False

for item in sorted(itemList):
  boxList = sorted(boxList, reverse = True)
  if boxList[0] > item:
    boxList[0] -= item
  else:
    print("item: {}".format(item))
    remainingItems.append(item)
    print("itemList: {}".format(itemList))
    itemList.remove(item)

remainingWeight = (boxWeight * numBoxes) - sum(boxList)
print("remainingWeight: {}".format(remainingWeight))

if remainingItems:
  itemsRemain = True