2013-04-07 2 views
0

Используя Python, я хочу случайно выбрать людей из списка и поместить их в группы по 5 без выбора одного и того же человека более одного раза. Люди определяются по 2 критериям: возраст и пол. Список людей выглядит следующим образом:Выбор случайных значений из списка до тех пор, пока они не исчезнут в Python

PPL = [1, 4, 6], [2, 5, 5], [3, 7, 3], [4, 2, 8], [5, 4 , 6]

где 3 номера в каждом списке представляют собой: возрастную категорию (1-5), # мужчин, число женщин. Я понимаю, что группы 5 не имеют большого значения, так как все, что мне нужно сделать, это сделать случайный список (а затем я могу подсчитать 5 за раз), но я не уверен, как сделать случайный список без повторное использование людей. Какие-либо предложения?
Я начал с нижеследующим (который на самом деле просто печатает оставшихся самцов и самок):

import random 

PPL = [1, 4, 6], [2, 5, 5], [3, 7, 3], [4, 2, 8], [5, 4, 6] 

age = range(0, 6) 
gender = [1, 2]#1 = male, #2 = female 

randomAge = random.choice(age) 
randomGender = random.choice(gender) 

count = 0 
PPLcounter = 0 
for P in PPL: 
     while P[randomGender] > 0: 
      PPL[PPLcounter][randomGender] = P[randomGender] - 1 
      MRemaining = PPL [PPLcounter][1] 
      FRemaining = PPL [PPLcounter][2] 
      count = count+1 
      print count, MRemaining, FRemaining 
     PPLcounter += 1 
+5

Я не понимая проблемы. Вы не можете просто использовать 'random.shuffle' на' PPL' и затем перебирать список по списку? Это было бы случайным. –

+2

правильный. Я согласен с @JoelCornett. Вы можете каждый раз появляться, чтобы быть уверенным, что не получите тот же элемент снова. – karthikr

+0

Я смущен тем, что должен содержать список случайных людей. – ecline6

ответ

0

Опираться на комментарий Joel Корнетт и А. Rodas Например:

Является ли это то, что вы хотите:

import random 

def gen_people_in_group(age, num_male, num_female): 
    males = ['m%s' % age] * num_male 
    females = ['f%s' % age] * num_female 
    return males + females 

def gen_random_sample(num_in_group=5): 
    groups = [1, 4, 6], [2, 5, 5], [3, 7, 3], [4, 2, 8], [5, 4, 6] 

    population = [] 
    for group in groups: 
     population += gen_people_in_group(*group) 

    random.shuffle(population) 

    for idx in xrange(0, len(population), num_in_group): 
     yield population[idx:(idx + num_in_group)] 

def main(): 
    for rand_group in gen_random_sample(): 
     print rand_group 

if __name__ == '__main__': 
    main() 

Вот один выход:

['m3', 'f3', 'm5', 'f4', 'm1'] 
['f4', 'f4', 'm4', 'f2', 'm2'] 
['m4', 'f3', 'm5', 'm3', 'f5'] 
['m3', 'f5', 'f1', 'm3', 'f4'] 
['m5', 'f2', 'f1', 'f1', 'f5'] 
['m1', 'f2', 'f2', 'f1', 'm2'] 
['f5', 'f4', 'f4', 'm2', 'f4'] 
['m3', 'm2', 'f2', 'f1', 'f5'] 
['m3', 'm5', 'm2', 'f5', 'f1'] 
['m1', 'm3', 'f3', 'm1', 'f4'] 
+1

'random' также имеет полезный метод' sample() ';) –

Смежные вопросы