【问题标题】:Assigning Tasks to People将任务分配给人员
【发布时间】:2014-06-28 17:09:52
【问题描述】:

需要注意的是,我是 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?

不是家庭作业,仅供参考。

【问题讨论】:

  • 您可以random.shuffle 任务列表,然后为每个人分割 4 个任务。

标签: python


【解决方案1】:

使用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 找到有关石斑鱼食谱的说明。

【讨论】:

  • 感谢您的回答。它揭示了我的 Python 课程中没有涵盖的内容。你能向我解释一下 ['task_%d' % (i,) for i in range(1, 17)] 是什么意思吗?我知道您创建了一个从循环生成的列表,但我不确定 'task_%d' %(i, ) 是什么意思。
  • 'task_%d' % (i,) 是老式的string formatting。它用int i 的值代替%d。另一种写法是'task_{:d}'.format(i)
【解决方案2】:

一种将分配的人员作为任务列表的dict 中的键的变体...请注意,这可能会分配不均匀数量的任务...因此您可以优先考虑人员列表,以便任务被分配到第一个列出的。 eg:如果你有 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]})

【讨论】:

    【解决方案3】:

    首先,如果您真的想要一个数据结构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)
    

    【讨论】:

      【解决方案4】:

      试试这个:

      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
      

      【讨论】:

      • 在被告知 random.shuffle 后,我发现这是(对我来说)最自然的方式,但我会看看其他答案如何。
      【解决方案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()
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-06-04
        • 2019-12-25
        • 2020-02-26
        • 2022-08-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多