繁体   English   中英

使用 Python 随机配对列表中的项目

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM