Python - 我可以将工单分发给有 2 个列表的员工吗?

  • 本文关键字:列表 我可以 Python python
  • 更新时间 :
  • 英文 :


我有一个名为Ticket的类和一个名为Employee的类, 类的实例存储在 2 个不同的列表中。

employee_objects = ["name1", "name2", "name3", "name4"]
ticket_objects = ["ticket1", "ticket2", "ticket3", "ticket4", "ticket5","ticket6", "ticket7", "ticket8"]
class Ticket:
def __init__(self, ticket_number):
self.ticket_number = ticket_number

class Employee: 
def __init__(self, name):
self.name = name
self.asigned_tickets = []        

基本上我想将工单平均分配给员工,并将工单添加到self.asigned_ticket列表中。这样我就可以打电话给Employee.name + Employee.asigned_tickets并查看名称和分配的票证。

当然。第一步是创建工单和员工的实例。

employees = [Employee(employee_name) for employee_name in employee_objects]
tickets = [Ticket(number) for number in ticket_objects]

然后,您可以非常轻松地将它们循环分发。

import itertools
for emp, tick in zip(itertools.cycle(employees), tickets):
emp.assigned_tickets.append(tick)

itertools.cycle创建在输入中循环的无限长度的迭代器。cycle('ABCD') -> A B C D A B C D A B C D A B ...

zip将两个集合配对在一起。由于tickets是有限的,我们可以相信它会终止zip(对比itertools.zip_longest这将扩展较短的集合以匹配最长集合的长度)

让我们编写一些测试!

# mymodule.py
import itertools
import typing
class Employee():
def __init__(self, name, tickets=None):
self.name = name
self.tickets = tickets if tickets is not None else []
def __eq__(self, other):
return isinstance(other, self.__class__) and self.name == other.name and self.tickets == other.tickets
def distribute_roundrobin(employees: typing.List[Employee], items: typing.List[typing.Any]):
"""
Distribute round-robin across all recipients, looping where necessary.
>>> employees = [Employee("name") for _ in range(3)]
>>> distribute_roundrobin(employees, 'ABCDEFGHIJ')
>>> expected = [
... Employee('name', ['A', 'D', 'G', 'J']),
... Employee('name', ['B', 'E', 'H']),
... Employee('name', ['C', 'F', 'I']),
... ]
>>> employees == expected
True
"""
for emp, item in zip(itertools.cycle(employees), items):
emp.tickets.append(item)
# from /bin/bash or etc
$ python -m doctest mymodule.py

最新更新