我有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
      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之外,它不会缩放,例如,如果将来我添加新的Entity和/或box。

因此,我正在寻找一种可以扩展的算法。我正在使用Python,django,PostgreSQL。我提取数据,很简单:

A.objects.all().order_by('-id')[:3]

最佳答案

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))
))

关于python - 元素类型组合的一种解决方案,当任何一种类型可以具有零个元素时,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54455128/

10-12 22:53