检查列表中的所有可能组合是否显示在另一个列表中的对象的属性中

时间:2015-11-28 03:09:02

标签: python iteration

我有许多需要以各种组合分配的任务,还有三个人可以分配给他们。关于哪些任务可以组合在一起有各种规则,但要点是总是会有三个任务,每个人必须始终只分配其中一个任务。我已经有了代码,它将创建一个列表列表,其中包含遵循规则的三个任务的所有可能组合:

lineups = [[Task1, Task2, Task3], [Task1, Task2, Task4],
           [Task1, Task2, Task5], [Task1, Task2, Task6], ...]

每个人都是:

的实例
class Person:

    def __init__(self):
        self.name = ''
        self.office = ''
        self.tasks = []

其中.tasks属性将存储该人员能够执行的任务。 people[Person1, Person2, Person3]的简单列表。

我已经做了很多搜索并尝试使用itertools.combinations以及zip()尝试合并这两个列表,但这些解决方案都没有给我正确的输出或我'误解了如何迭代它。

我要做的是检查三个tasks的所有组合,以确保有people的某些阵容可以涵盖所有三个任务,每个Person都有一个task重点是我不希望每个Person都必须学习列表中的每个task,但需要确保没有任何合法组合离开我没有人能够完成任务。如果有未涵盖的组合,我想建立一个这些组合的列表,这样我就可以教人们解决问题的新任务。

1 个答案:

答案 0 :(得分:0)

因此,您可以拥有自己想要“覆盖”的所有任务组合。最简单的解决方案是创建所有组合的列表(来自您的员工的所有技能列表的交叉产品),并检查您的每个任务组合是否实际涵盖。这是一次尝试。

import itertools

tasks_combinations = [[1, 2, 3], [2, 3, 4]]
people_tasks = [[1, 3], [2, 3], [3, 4]]

people_tasks_product = map(set, (itertools.product(*people_tasks)))

for tasks_combination in tasks_combinations:
    if set(tasks_combination) in people_tasks_product:
        print('Task combination {} is covered.'.format(tasks_combination))
    else:
        print('Task combination {} is NOT covered.'.format(tasks_combination))

Evert回答的问题是,它不包括两个人完全延迟并且只有一个人可以完成所有任务的情况。