Python 当任何类型都可以有零个元素时,元素类型组合的解决方案
我有3个模型/实体,A、B、C(后端是django) 在前端,我有3个空框,我需要在其中添加A、B、C的实例。 A、B、C的可用实例数可以是0到无限 理想情况下,我应该显示A的1个、B的1个和C的1个,但有时任何实体都可能没有实例。可以是无实例、一个实例或多个实例 我的基本方法是使用Python 当任何类型都可以有零个元素时,元素类型组合的解决方案,python,django,python-3.x,Python,Django,Python 3.x,我有3个模型/实体,A、B、C(后端是django) 在前端,我有3个空框,我需要在其中添加A、B、C的实例。 A、B、C的可用实例数可以是0到无限 理想情况下,我应该显示A的1个、B的1个和C的1个,但有时任何实体都可能没有实例。可以是无实例、一个实例或多个实例 我的基本方法是使用ifs,但效率不高,请参见伪代码中的一个分支: if not C: if A: if not B: show up to 3 of A if they are available
ifs
,但效率不高,请参见伪代码中的一个分支:
if not C:
if A:
if not B:
show up to 3 of A if they are available
elif B:
if at least 2 of A:
show 2 of A and 1 Of B
if 1 of A:
show 1 of A and up to 2 of B
elif not A:
show up to 3 of B if exist
除了在所有分支上都有数十个ifs
,它不会扩展,例如,如果我将来添加一个新的实体和/或框
所以,我在寻找一种可以扩展的算法。我正在使用Python、django、PostgreSQL。我提取数据,很简单:
A.objects.all().order_by('-id')[:3]
之后可以按型号订购;它正在工作,但我得到了类似于[a,c,a]的东西,我想要['a','a','c']@user3541631当然。如果您想按Django模型名称的字母顺序排序,您可以使用
排序(框[:3],key=lambda x:x.\u meta.model.\uuuuu name\uuuu)
我想要列表类型的索引顺序(a、b、c只是名称占位符,所以在示例中是字母顺序)
models = [A, B, C]
num_boxes = len(models) # but could be different
objects = [list(model.objects.all().order_by('-id')[:num_boxes])
for model in models]
boxes = []
while any(objects):
for row in objects:
if row:
boxes.append(row.pop(0))
print(sorted(
boxes[:num_boxes],
key=lambda x: models.index(type(x))
))