python-3.x - 用零件填充列表,直到零件体积总和达到容量,然后创建新列表并填充
问题描述
我有一个有质量的零件列表,并且想要创建一批零件。批次以体积容量为边界。
每当将下一部分放入批次中会超过该批次容量时,就应该创建一个新批次。一个批次的容量不是条目的长度或数量,而是一个固定的体积,分配的部分体积之和不能超过。
for part in partlist:
if cap - part_volume >= 0:
batch.append(part)
cap -= part_volume
else:
# create new_batch
new_batch.append(part)
解决方案
您不需要“命名”批次,将它们填充到列表中:
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,但这样应该清楚什么是做什么的......
推荐阅读
- c# - 如何解决 Azure Web 应用程序上的“请求标头过长”
- python - 尝试处理 IndentationError 异常
- kendo-ui-angular2 - 按下带有文本框值的回车键后如何触发事件?
- python - 使用 pyserial 的 AT+CIMI 命令导致空字符串
- arrays - Array 仅打印最后一项回收站视图
- javascript - 错误:TS2304:找不到名称“t”。在运行角度项目时
- javascript - 远程脚本之前或之后的dataLayer:Google Analytics和TagManager的区别
- javascript - 不存在的分号
- arrays - 我可以提高python3中数组乘法的速度吗
- react-native - react-native 中的自定义键盘