对于一所大学的某门课程,要求学生每周上课主题演讲。学生每周随机出现。
函数presOrder
应该接收两个参数,(1)一个正整数n,表示演示的周数,(2)名称列表,该名称列表仅对于第一次演示。该函数返回一周的展示顺序的列表清单。每个列表以完全随机的顺序包含给定名称,以确保名称的顺序与前一周的顺序不同,并且每个名称的位置均与前一周的顺序不同。顺序不同意味着上周之前和之后的名称在下周应该不同。
import random
import itertools
def notRandom(lst,plst,no):
result = True
for i in range(no-1):
result = result and (lst[i] == plst[i+1])
result = result and (lst[no-1] == plst[0])
if result:
return True
result = True
for i in range(1,no):
result = result and (lst[i] == plst[i-1])
result = result and (lst[0] == plst[no-1])
if result:
return True
return False
# My attempt
def presOrder(n,namelst):
permutation = itertools.permutations(namelst)
rand = [] + [namelst]
prev = namelst
for lst in permutation:
if not(notRandom(lst,prev,len(namelst))) and len(rand) < n:
rndom = True
for i in range(len(namelst)):
if not(lst[i] == prev[i]):
rndom = rndom and True
else:
rndom = rndom and False
if rndom:
rand += [lst]
prev = lst[:]
else:
continue
return rand
names = ['Abi Jones','Bob King','Carl Llewellyn','Danielle McIntosh','Earl Newell','Frank Olephante','George Brown','Harry Zephers']
#example
>>> print(presOrder(5,names))
>>> [['Abi Jones','Harry Zephers'],('Bob King','Abi Jones','Harry Zephers','George Brown'),('Carl Llewellyn','Harry Zephers'),('Danielle McIntosh',('Earl Newell','Harry Zephers')]
该代码似乎可以(某种程度上)正常工作,但我需要对其进行更多测试。同时,如何优化presOrder
的代码?