应用条件对随机拾取元素的过程

问题描述 投票:0回答:1

我需要挑选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']] ]
python random itertools
1个回答
0
投票

您尚未正确应用该条件。试试这个:

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的对。

© www.soinside.com 2019 - 2024. All rights reserved.