【发布时间】:2020-03-05 11:35:51
【问题描述】:
对于大学的某门课程,学生需要每周在课堂上展示主题。学生每周以随机顺序出现。
函数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', 'Bob King', 'Carl Llewellyn', 'Danielle McIntosh', 'Earl Newell', 'Frank Olephante', 'George Brown', 'Harry Zephers'], ('Bob King', 'Abi Jones', 'Danielle McIntosh', 'Carl Llewellyn', 'Frank Olephante', 'Earl Newell', 'Harry Zephers', 'George Brown'), ('Carl Llewellyn', 'Bob King', 'Abi Jones', 'Danielle McIntosh', 'Earl Newell', 'Frank Olephante', 'George Brown', 'Harry Zephers'), ('Danielle McIntosh', 'Abi Jones', 'Bob King', 'Carl Llewellyn', 'Frank Olephante', 'Earl Newell', 'Harry Zephers', 'George Brown'), ('Earl Newell', 'Bob King', 'Abi Jones', 'Danielle McIntosh', 'Carl Llewellyn', 'Frank Olephante', 'George Brown', 'Harry Zephers')]
代码似乎(在某种程度上)可以正常工作,但我需要对其进行更多测试。同时,如何优化presOrder的代码?
【问题讨论】:
-
说实话 - 你的代码有点太长了,我现在无法理解它的想法。但是,这个问题很有趣,我想知道第 n 周和第 n+2 周的大等式是故意的还是应该优化的缺点。
-
这能回答你的问题吗? How to randomize a list to meet conditions
标签: python list sorting optimization permutation