[英]Randomly pair items in a list using Python
我正在研究一种在我的班级中随机配对学生的方法。 这是我想出的:
import random
students = ['Joe', 'Sam', 'Bob', 'Jill', 'Paul', 'Eric', 'Chai', 'Chris', 'Sui',
'Matt', 'Leon', 'Nami', 'Leonard', 'Sai', 'Mike', 'Julie', 'Jim', 'Holly',
'Marge', 'Ed']
random.shuffle(students)
group1 = students[0:10]
group2 = students[10:]
combined = zip(group1, group2)
for first_student, second_student in combined:
print str(first_student), "and", str(second_student)
但是,如果您不知道学生人数,您会怎么做? 关于如何改进这一点的任何其他建议?
编辑:下面是包含几个建议的成品。 我想在不导入 itertools 的情况下做到这一点。 (因为我想了解发生了什么。)
import random
students = ['Joe', 'Sam', 'Bob', 'Jill', 'Paul', 'Eric', 'Chai', 'Chris', 'Sui',
'Matt', 'Leon', 'Nami', 'Leonard', 'Sai', 'Mike', 'Julie', 'Jim', 'Holly',
'Marge', 'Ed']
random.shuffle(students)
groups = zip(*[iter(students)]*2)
for first_student, second_student in groups:
print str(first_student), "and", str(second_student)
您的解决方案通过将学生分成两组,并且每组只选一个来限制可能的配对。 最好只对整个学生名单进行一次洗牌,然后一次两次进行配对。
import random
from itertools import izip_longest
def grouper(iterable, n, fillvalue=None):
"Collect data into fixed-length chunks or blocks"
# Taken from itertools recipes:
# https://docs.python.org/2/library/itertools.html#recipes
# grouper('ABCDEFG', 3, 'x') --> ABC DEF Gxx
args = [iter(iterable)] * n
return izip_longest(fillvalue=fillvalue, *args)
students = ['Joe', 'Sam', 'Bob', 'Jill', 'Paul', 'Eric', 'Chai', 'Chris',
'Sui', 'Matt', 'Leon', 'Nami', 'Leonard', 'Sai', 'Mike',
'Julie', 'Jim', 'Holly', 'Marge', 'Ed']
random.shuffle(students)
for first_student, second_student in grouper(students, 2):
print str(first_student), "and", str(second_student)
我遇到了同样的问题并使用此代码来解决它。
import random
students_list_1 = ['Hadi', 'Farzad', 'Amirhossein', 'Yasaman']
students_list_2 = students_list_1.copy()
random.shuffle(students_list_1)
random.shuffle(students_list_2)
while len(students_list_2) > 0:
if students_list_2[-1] == students_list_1[-1]:
std2 = students_list_2.pop(0)
std1 = students_list_1.pop()
print(std1, '-', std2)
students_list_1.remove(std2)
students_list_2.remove(std1)
else:
std2 = students_list_2.pop()
std1 = students_list_1.pop()
print(std1, '-', std2)
students_list_1.remove(std2)
students_list_2.remove(std1)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.