该项目是使用特定算法将项目分类到框中。我在使用字典将项作为值放入给定框中时遇到麻烦。我的主要问题是,当字典中有多个值时,我不知道如何检索键中的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
答案 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)
如果itemList
和boxList
已经排序,则无需再次对其进行排序。另外,由于(据我所知)boxList
只是boxDict
的值列表,而itemList
只是itemDict
的值列表,不需要(boxList
和itemList
)或(boxDict
和itemDict
)中的一个。
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