Применение условий к процессу случайного выбора элемента - PullRequest
0 голосов
/ 17 февраля 2019

Мне нужно выбрать 2 группы из 2 учеников, которые не говорят на одном языке без повторения.Каждый студент появляется только один раз.

У меня есть этот список

import random
from itertools import permutations
seq = [['Sham','Arabic'],['Amina', 'Arabic'], ['Bill', 'French'], ['Qing','Hindi']]

Мне нужно выбрать 4 группы из 2 учеников, которые не говорят на одном языке без повторения.

У меня есть эта функция:

def group (x, y):
    res=[]
    #N = len(seq)
    for i in range( y):
        while len(res) < y:
            res = random.sample(x,k=y)
            while res[i][1] == res[i-1][1]:
                return group(x,y)
    return res

Затем я применяю эти условия, чтобы получить окончательные результаты: один учащийся должен появиться только в одной группе:

final = []
for i in range(2):
    pick = group (seq, 2)

    if pick in final or pick[::-1]  in final:
        group(seq, 2)
        pass

    for i in pick:
        for j in i:
            if j  in final:
                group(seq, 2)
                pass
    else:
        final.append(pick)

print (final)

Я все еще получаю неправильные результаты, один студентпоявляются более одного раза.ожидаемые результаты:

     [ [['Sham','Arabic'],['Qing','Hindi']],
 [['Bill', 'French'], ['Amina', 'Arabic']] ]

но что я получаю (притворство существовало дважды):

[ [['Sham','Arabic'],['Qing','Hindi']],
 [['Bill', 'French'], ['Sham','Arabic']] ]

1 Ответ

0 голосов
/ 17 февраля 2019

Вы не правильно применили условие.Попробуйте это:

final = []
for i in range(4):
    pick = group (seq, 2)
    while pick in final or pick[::-1] in final:
        pick = group(seq, 2)
    final.append(pick)

print(final)

Вы должны продолжать выбирать, пока новый pick не будет в final.Это можно сделать с помощью цикла while.

Как я уже упоминал в комментарии, невозможно, чтобы четыре группы удовлетворяли условию, но если вам нужны две группы (как в ожидаемом результате), удовлетворяющие условиям,вот дополнительное условие, которое вам нужно применить:

picked = []
final = []
for i in range(2):
    pick = group (seq, 2)
    while pick in final or pick[::-1] in final or any(p in picked for p in pick):
        pick = group (seq, 2)
    final.append(pick)
    picked.extend(pick)

print(final)

Вы можете использовать дополнительный список (picked), в котором содержатся выбранные на данный момент пары язык-студент.Затем продолжайте выбирать, пока в новой группе нет пары из picked.

...