Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/google-maps/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 检查列表中的所有可能组合是否显示在另一个列表中对象的属性中_Python_Iteration - Fatal编程技术网

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

Python 检查列表中的所有可能组合是否显示在另一个列表中对象的属性中,python,iteration,Python,Iteration,我有一大堆任务需要以不同的组合分配,还有三个人要分配给他们。关于哪些任务可以同时进行,有各种各样的规则,但要点是,始终会有三项任务,每个人必须始终被分配其中一项任务。我已经有了创建一个列表列表的代码,其中包含三个任务的所有可能组合,这些任务遵循以下规则: lineups = [[Task1, Task2, Task3], [Task1, Task2, Task4], [Task1, Task2, Task5], [Task1, Task2, Task6], ...] 每个

我有一大堆任务需要以不同的组合分配,还有三个人要分配给他们。关于哪些任务可以同时进行,有各种各样的规则,但要点是,始终会有三项任务,每个人必须始终被分配其中一项任务。我已经有了创建一个列表列表的代码,其中包含三个任务的所有可能组合,这些任务遵循以下规则:

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
属性将存储此人能够执行的任务<代码>人员是一个简单的
[Person1,Person2,Person3]
列表

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


我想做的是检查三个
任务的所有组合
以确保有一些
人员
可以覆盖所有三个任务,每个
人员
有一个
任务
重点是我不希望每个
人员
都必须学习列表中的每个
任务
,但我需要确定的是,没有一个合法的组合让我无法承担任何任务。如果有未涵盖的组合,我想建立一个这些组合的列表,这样我就可以教人们新的任务来解决问题。

这样,你就有了所有你希望员工“涵盖”的任务组合。最简单的解决方案是创建所有组合的列表(员工所有技能列表的叉积),并检查是否实际涵盖了每个任务组合。这里有一个尝试

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))

埃弗特回答的问题是,它不包括两个人完全是弱智,例如,只有一个人可以完成所有任务。

我冒昧地删除了你的附加问题,专注于一个问题。我可以看出这是我需要的,但我的测试仍然没有达到我需要的程度。它告诉我,即使我将每个人都列为能够完成每项任务的人,也没有涵盖各种组合,因此不可能出现未涵盖的阵容。如果每个人都能实际完成该任务组合中使用的任务,你会举一个未涵盖的任务组合示例吗?由于我使用的是
set
,我还假设您没有在一个组合中重复两次相同的任务,并且一个组合始终包含3项。部分问题似乎是我实现了错误的任务。当每个人都包含所有任务时,它不再这样做。但是,如果
task\u组合=[[1,2,3,4],[1,2,4],[1,2,5],[1,3,5],[1,4,5],
person1.tasks=[1]
person2.tasks=[2,3,4]
person3.tasks=[2,4,5]
,则返回未包含的
[1,3,4],[1,3,5],
。当我更改
任务组合中列表的顺序时,会同时更改哪些组合显示为未覆盖,有时会更改多少。在构建
人员任务时,您可能会遇到问题
如果您有
人员任务=[[1]、[2,3,4]、[2,4,5]]
我将您的原始代码复制并粘贴到一个空脚本中,更改了
任务组合
以包括这六个组合,并更改为
人员任务=[[1]、[2,3,4]、[2,4,5]
。结果是:
包含了任务组合[1,2,3]。包括任务组合[1,2,4]。未涵盖任务组合[1、2、5]。不包括任务组合[1,3,4]。未涵盖任务组合[1、3、5]。任务组合[1,4,5]未包含在内。
我不明白为什么对于相同的代码,我们会得到不同的结果。