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

Check whether all possible combinations from a list appear in an attribute of objects in another list

我有一堆任务需要以不同的组合分配给三个人。关于哪些任务可以一起完成有多种规则,但要点是始终只有三个任务,并且每个人必须始终被分配到其中一个任务。我已经有了创建列表列表的代码,其中包含遵循以下规则的三个任务的所有可能组合:

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 的阵容可以涵盖每个 [=19] 的所有三个任务=] 有一个 task. 关键是我不希望每个 Person 都必须学习列表中的每个 task,但需要确保 none 的合法组合让我无法完成一项任务。如果有未涵盖的组合,我想构建这些组合的列表,以便我可以教人们解决问题的新任务。

因此,您拥有您的员工想要 "covered" 的所有任务组合。最简单的解决方案是创建所有组合的列表(您员工的所有技能列表的叉积)并检查您的每个任务组合是否实际涵盖。这是一个尝试。

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 的回答的问题在于它没有涵盖两个人完全是智障并且只有一个人可以完成所有任务的情况。