首页 > 解决方案 > 用零件填充列表,直到零件体积总和达到容量,然后创建新列表并填充

问题描述

我有一个有质量的零件列表,并且想要创建一批零件。批次以体积容量为边界。

每当将下一部分放入批次中会超过该批次容量时,就应该创建一个新批次。一个批次的容量不是条目的长度或数量,而是一个固定的体积,分配的部分体积之和不能超过。

    for part in partlist:
       if cap - part_volume >= 0:
           batch.append(part)
           cap -= part_volume
       else:
           # create new_batch
           new_batch.append(part)

标签: python-3.xlistdictionary

解决方案


您不需要“命名”批次,将它们填充到列表中:

class Thing:
    def __init__(self, mass, volume):
        self.mass = mass
        self.volume = volume 
    def __str__(self):
        return f"(M: {self.mass} V:{self.volume})" 

class Container:
    def __init__(self, volume = 20):
        self.volume = volume
        self.things = []
    def add(self, t):
        self.things.append(t)
    def space_left(self):
        return self.volume - sum(t.volume for t in self.things)
    def fits(self, t):
        return self.space_left() - t.volume >= 0 
    def __str__(self):
        return f"[{' | '.join(str(t) for t in self.things)}] Empty: {self.space_left()}"

一些测试数据:

from random import randint 

things = [Thing(randint(1,100), randint(2,10)) for _ in range(30)]

# add one empty container
containers = [Container()]

for t in things:
    # check if it fits into last container´, if not create new empty one
    # and add to end of list
    if not containers[-1].fits(t):
        containers.append(Container())
    # add thing to container at end of list
    containers[-1].add(t)

print(*containers, sep="\n")

输出:

[(M: 4 V:8) | (M: 62 V:7) | (M: 24 V:4)] Empty: 1
[(M: 2 V:10) | (M: 51 V:5)] Empty: 5
[(M: 81 V:6) | (M: 32 V:8)] Empty: 6
[(M: 3 V:9) | (M: 58 V:7)] Empty: 4
[(M: 87 V:6) | (M: 23 V:3) | (M: 90 V:2) | (M: 74 V:4) | (M: 61 V:4)] Empty: 1
[(M: 18 V:3) | (M: 82 V:6) | (M: 40 V:4) | (M: 100 V:6)] Empty: 1
[(M: 7 V:6) | (M: 65 V:7)] Empty: 7
[(M: 37 V:8) | (M: 23 V:3) | (M: 28 V:4)] Empty: 5
[(M: 23 V:8) | (M: 39 V:6) | (M: 13 V:2)] Empty: 4
[(M: 6 V:7) | (M: 16 V:4)] Empty: 9
[(M: 76 V:10) | (M: 3 V:5)] Empty: 5 

您根本不需要使用类和函数,您可以只使用元组和 lambda,但这样应该清楚什么是做什么的......


推荐阅读