应该注意我是Python的初学者。我有 16个需要完成的任务,这些任务包含在列表中:
task_list = ['task_1',
'task_2',
'task_3',
'task_4',
'task_5',
'task_6',
'task_7',
'task_8',
'task_9',
'task_10', etc...]
我还有四个人,A,B,C和D人,他们将这些任务平均分配(每人4个任务)。对于这些人中的每一个人,我创建了一个空列表。
personA_tasks = []
personB_tasks = [],
etc.
我如何随机将这16个任务附加到这四个列表中,以便四个列表中每个列表的长度为4?
这是不作业,作为一个FYI。
答案 0 :(得分:4)
使用random.shuffle随机播放列表(就地)。
然后使用grouper recipe,zip(*[iterator]*4)
将项目收集到4个小组中:
In [32]: import random
In [33]: task_list = ['task_%d' % (i,) for i in range(1, 17)]
In [34]: random.shuffle(task_list)
In [35]: persons = zip(*[iter(task_list)]*4)
In [36]: persons
Out[36]:
[('task_7', 'task_2', 'task_15', 'task_13'),
('task_6', 'task_11', 'task_9', 'task_12'),
('task_5', 'task_10', 'task_4', 'task_1'),
('task_3', 'task_8', 'task_14', 'task_16')]
从好的方面来说,石斑鱼配方非常优雅。不幸的是,它不是最容易理解的Python。要了解石斑鱼配方,您需要了解:
有了这些概念,可以找到石斑鱼食谱的解释here。
答案 1 :(得分:1)
一种变体,将指定的人员作为dict
中的一个关键字与任务列表保持一致...请注意,这可能会分配不均匀的任务数量...因此您可以优先考虑人员列表等任务被分配到第一个列出的。例如:如果你有3个任务,2个人,那么1个人将获得2个,2个人将获得1个。
from collections import defaultdict
from random import shuffle
from itertools import cycle, izip
tasks = range(16)
people = ['Bob', 'Jim', 'Sam', 'Mel']
shuffle(tasks)
assigned = defaultdict(list)
for task, person in izip(tasks, cycle(people)):
assigned[person].append(task)
# defaultdict(<type 'list'>, {'Mel': [10, 2, 8, 4], 'Bob': [0, 11, 15, 13], 'Jim': [1, 7, 5, 14], 'Sam': [12, 9, 6, 3]})
答案 2 :(得分:1)
首先,当你真正想要一个数据结构persons_tasks
时,定义四个变量是个坏主意,每个人都是一个密钥或数字。
然后,您可以列出哪个人接受哪个任务并随机播放此列表:
import random
from collections import defaultdict
persons = ['A','B','C','D']
tasks = ['Task_%i' for i in range(1,17)]
person_for_task = persons * (len(tasks) / len(persons))
random.shuffle(person_for_tasks)
persons_tasks = defaultdict(list)
for person, task in zip(person_for_task, tasks):
persons_tasks[person].append(task)
答案 3 :(得分:0)
试试这个:
from random import shuffle
task_list = ['task_1', 'task_2', 'task_3', 'task_4',
'task_5', 'task_6', 'task_7','task_8',
'task_9', 'task_10', 'task_11', 'task_12',
'task_13', 'task_14', 'task_15', 'task_16']
shuffle(task_list)
print task_list
personA_tasks = task_list[0:4]
personB_tasks = task_list[4:8]
personC_tasks = task_list[8:12]
personD_tasks = task_list[12:]
print personA_tasks
print personB_tasks
print personC_tasks
print personD_tasks
答案 4 :(得分:0)
这是我的解决方案:
import random
tasks = ['tast1',
'tast2',
......
'tast13',
'task14']
workers = ['Maria1', 'Maria2', 'Maria3']
def assign_random():
tasks_per_worker = len(tasks) / len(workers)
random.shuffle(tasks)
rand_tasks = zip(*[iter(tasks)] * tasks_per_worker)
for person, tasks_list in zip(workers, rand_tasks):
print person, tasks_list
if len(tasks) % len(workers) != 0:
print 'There are %d task need to volunteer.... ' % (len(tasks) % len(workers))
volunteer = []
for num in range(len(tasks) % len(workers)):
volunteer.append(tasks[-1])
tasks.pop(-1)
print '.. there are: ', volunteer
print '+++++++++++++++++++++++++'
assign_random()