我不相信我正确地提出了这个问题,但这是我想要做的。
在django admin中,我想写一个动作来随机对我的参赛者名单进行排序,并且不允许两个名字相同的人在彼此的4个记录之内。基本上, 如果你有John L. John C. Carey J,Tracy M. Mary T.,记录会如下所示:
John L。
Mary T。
Carey J。
Tracy T。
John C.
OR
如何编写一个可以创建随机组的操作,其中两个具有相同名称的人不在同一组中,如下所示:
John L. John C. Carey J,Tracy M. Mary T. =
第1组
John L。
Mary T。
Carey J。
Tracy T。
第2组
John 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
答案 0 :(得分:0)
你的第一个问题总是无法解决。想想所有参赛者都有相同的名字,那么你实际上找不到解决方案。
对于第二个问题,我可以建议一种算法来做到这一点。 由于我没有看到任何组的数量限制,我将建议一种方法来创建最少数量的组。
编辑:我认为你不希望2个人拥有相同的#34;名字"在一组。
步骤
计算每个名称的外观
count = {}
for x in queryset:
if x.fname not in count:
count[x.fname] = 0
count[f.name] += 1
找到外观最多的名称
N = 0
for x in queryset:
if count[x.fname] > N:
N = count[x.fname]
创建N
个组,其中N
等于步骤2中名称的出现次数
对于每个名称,生成一个随机数X
,其中X < N
。
尝试将名称放入组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中添加了详细信息。
从您编辑的代码段中,我认为您实际上并不需要定义&#34; group&#34;在模型中,似乎你只需要一个组号。