Использование классов данных и словарей для решения «проблемы с коробками» - PullRequest
0 голосов
/ 30 октября 2018

Проект состоит в том, чтобы сортировать элементы - используя определенный алгоритм - в ящики. У меня проблемы с размещением элементов в виде значений в определенном поле с использованием словарей. Моя основная проблема заключается в том, что я не могу понять, как получить 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

Ответы [ 2 ]

0 голосов
/ 30 октября 2018

Если 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
0 голосов
/ 30 октября 2018

Я думаю, что вы ищете словарь .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. Похоже, что вы можете просто проходить по элементам или полям или иметь словарь с весом в качестве ключей.

...