将任务分配给人
需要说明的是,我是Python的初学者。我有十六个任务需要完成,这些任务被放在一个列表里:
task_list = ['task_1',
'task_2',
'task_3',
'task_4',
'task_5',
'task_6',
'task_7',
'task_8',
'task_9',
'task_10', 等等...]
我还有四个人,分别是A、B、C和D,他们会把这些任务平均分配,每个人分到4个任务。为了每个人,我都创建了一个空列表。
personA_tasks = []
personB_tasks = [],
等等。
我该如何随机将这16个任务分配到这四个列表中,使得每个列表的长度都是4呢?
顺便说一下,这不是作业。
5 个回答
这是我的解决方案:
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()
试试这个:
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
首先,定义四个变量其实不是个好主意。如果你想要的是一个数据结构,比如叫做 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)
这个变体是把负责的人作为一个键,放在一个dict
(字典)里,字典的值是一个任务列表。需要注意的是,这样可能会导致任务分配不均匀……所以你可以优先考虑人员列表,这样任务就会优先分配给列表中排在前面的人。例如:如果你有3个任务和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]})
使用 random.shuffle 可以对列表进行洗牌(就地修改)。然后用 grouper 这个方法,也就是 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')]
优点是,grouper 这个方法看起来很优雅。不过,理解起来并不是最简单的 Python 代码。要理解这个方法,你需要知道以下几个概念:
掌握了这些概念后,可以在 这里 找到关于 grouper 方法的详细解释。