我需要挑选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']] ]
您尚未正确应用该条件。试试这个:
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
的对。