0

我不确定我是否正确地提出了这个问题,但这是我想做的。

在 django admin 中,我想编写一个操作,对我的参赛者列表进行随机排序,并且不允许两个名字相同的人在彼此的 4 条记录内。所以基本上,如果你有 John L. John C. Carey J, Tracy M. Mary T.,记录会像这样列出:

约翰·L。

玛丽·T。

凯里·J。

特蕾西·T。

约翰 C。

              OR

我如何编写一个动作来创建随机组,其中两个同名的人不会在同一个组中,如下所示:

John L. John C. Carey J, Tracy M. Mary T. =

第 1 组

约翰·L。

玛丽·T。

凯里·J。

特蕾西·T。

第 2 组

约翰 C。

如果不是很清楚,请原谅我,让我知道,我会尝试进一步指定,但任何帮助将不胜感激

EDIT: 
Is this what you are referring to? I can't quite figure out how to compare the fields to see if they are the same

   Model:
class people(models.Model)
   fname = model.CharField()
   lname = model.CharField()
   group = model.IntegerField()


 View:
   N = 4
   Num = randint(0, N-1)
   for x in queryset:
       x.group = Num
       if group == group| fname == fname | lname == lname:
           x.group = (Num + 1) % N
4

1 回答 1

0

你的第一个问题不能总是得到解决。想一想所有参赛者的名字都一样,那你实际上是找不到解决办法的。

不过,对于第二个问题,我可以建议一种算法来做到这一点。由于我没有看到对组数的任何限制,因此我将建议一种方法来在此处创建最少的组数。

编辑:我假设您不希望组中有 2 个具有相同“名字”的人。

步骤是

  1. 计算每个名字的出现次数

    count = {}
    for x in queryset:
        if x.fname not in count:
             count[x.fname] = 0
        count[f.name] += 1
    
  2. 找到最多见的名字

    N = 0
    for x in queryset:
        if count[x.fname] > N:
            N = count[x.fname]
    
  3. 创建N组,其中N等于步骤2中名称的出现次数

  4. 对于每个名称,生成一个随机数X,其中X < N

    尝试将名称放入 group X。如果组X已经具有该名称,请设置X = (X + 1) % N并重试,重复直到成功。你总会找到一个小组来放置参赛者。

    from random import randint
    groups = [[]] * N
    for item in queryset:
        X = randint(0, N-1)
        while item.fname in groups[X]:
            X = (X + 1) % N
        groups[X].append(item.fname)
        item.group = X
    

编辑:

在步骤 1、2、4 中添加了详细信息。

从您编辑的代码段中,我认为您实际上不需要在模型中定义“组”,因为您似乎只需要一个组号。

于 2014-07-28T09:41:37.893 回答