循环直到满意LIST

时间:2017-08-26 11:19:31

标签: python loops grouping

这是我用于生成包含n个成员和x组的组的代码。然后根据每组中有多少相似的数字对每组进行评级,例如(1,1,1,1)= 1,因为只有1个数字,但是(1,2,3,3)= 3,因为有3个数字。我试着给它做一个循环,直到这个地方的9个组中的任何一组的速率低于某个z值,但是由于某种原因它没有起作用。任何人都可以提出一种方法来根据最后的评级数来循环这个系统吗?

import numpy
import math
import random
members=4
n_groups =4
participants=list(range(1,members+1))*n_groups
#print participants 
random.shuffle(participants)

with open('myfile1.txt','w') as tf:
    for i in range(n_groups):
        group = participants[i*members:(i+1)*members]
        for participant in group:
            tf.write(str(participant)+' ')
        tf.write('\n')

with open('myfile1.txt','r') as tf:
    g = [list(map(int, line.split())) for line in tf.readlines()]
    print(g)


my_groups =g

def get_rating(group):
    return len(set(group))


for each_grp in my_groups:  
    print(get_rating(each_grp))

在这种情况下的输出: [[1,4,2,3],[3,4,4,2],[1,1,2,3],[3,4,2,1]]     4     3     3     4

我已将其简化为4名成员,4组:

[[1,4,2,3],[3,4,4,2],[1,1,2,3],[3,4,2,1]] 4(因为第1组有4个不同的数字) 3(因为第2组有3个不同的数字) 3(因为第3组有3个不同的数字) 4(因为第4组有4个不同的数字)

方括号中的东西是4组,下面的4个数字对它进行评分。我试图得到一个循环,继续尝试它,直到说最后每组的4个评级数中的一个下降到1,然后将停止

所以我想要一个循环来继续生成新的组,直到组下面的评级数字(在这种情况下:4,3,3,4)低于某个值,如2,2,2,2

2 个答案:

答案 0 :(得分:1)

一种有点天真的方法是将整个程序包装成一个while循环,检查所有组的分数。类似的东西:

# WARNING, UNTESTED CODE
my_groups = []
while any([get_rating(g) for g in groups] lambda x: x < 2):
  # ...Do e'rythang else...

更明智的做法是逐个查看您的群组,并在每次 之前获得评分

*已更新为工作代码*

import numpy
import math
import random
members=4
n_groups =4
participants=list(range(1,members+1))*n_groups
#print participants 
random.shuffle(participants)

def get_rating(group):
  return len(set(group))


with open('myfile1.txt','w') as tf:
  for i in range(n_groups):
    group = participants[i*members:(i+1)*members]

    # right here
    while(get_rating(group) < 2):
      # Do it again
      random.shuffle(participants)
      group = participants[i*members:(i+1)*members]

    # now right it
    for participant in group:
        tf.write(str(participant)+' ')
    tf.write('\n')

with open('myfile1.txt','r') as tf:
    g = [list(map(int, line.split())) for line in tf.readlines()]
    print(g)


my_groups =g

for each_grp in my_groups:  
    print(get_rating(each_grp))

答案 1 :(得分:1)

您也可以使用numpy

import numpy as np

def get_groups(members, n_groups):
    return np.random.randint(1, 5, (n_groups, members))

g = get_groups(4, 4)
while not 1 in [np.unique(sub_g).shape[0] for sub_g in g]:
    g = get_groups(4, 4)

其中:

  1. np.random.randint(1, 5 (n_groups, members))生成n_groupsmembers组,其中填充了range(1, 5)
  2. 中的随机值
  3. np.unique(sub_g).shape[0]获取您的评分(组中唯一值的数量)
  4. [np.unique(sub_g).shape[0] for sub_g in g]g
  5. 中的每个小组重复前一步骤
  6. while not 1 in重复循环,直到在上面计算的列表中找到值1(组中的所有值都相等)
  7. g = get_groups(4, 4)重复第1步