0

该项目是使用特定算法将项目分类到盒子中。我无法使用字典将项目作为值放入给定的框中。我的主要问题是,当字典中有多个值时,我无法弄清楚如何检索字典中键的 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

对于上下文,这是我的代码

这是文本文件的示例:pastebin

4

2 回答 2

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 循环,函数也会执行得更好。似乎您可以遍历项目或框,或者只是有一个以权重作为键的字典。

于 2018-10-30T02:30:40.053 回答
0

如果itemListboxList已经排序,则无需再次排序。此外,由于(据我了解)boxList只是 的值列表boxDict,并且itemList只是 的值的列表,因此itemDict您不需要 ( boxListand itemList) 或 ( boxDictand itemDict) 中的一个或另一个。

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

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

真正做到这一点的最好方法可能是构建一个class Box(),因为这些盒子应该被命名,并跟踪它们包含的项目。此代码将为您提供 (1) 和 (4) 目标。对于(2)和(3),您可以创建一个自定义Box()类;为此,您可以定义 custom__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
于 2018-10-30T04:30:51.093 回答