将任务分配给人员

时间:2014-05-11 08:08:17

标签: python

应该注意我是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。

5 个答案:

答案 0 :(得分:4)

使用random.shuffle随机播放列表(就地)。 然后使用grouper recipezip(*[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()