Python 查找满足特定条件的列表列表的子集

Python find subsets of a list of lists that fulfil a specific condition

感谢给我机会在这里提问。

一个小背景故事:我需要/想要找到满足特定条件的集合。这些条件可能非常复杂,但我希望能够根据一个简单的示例进行调整。

首先,让我们创建一个示例:

from itertools import permutations
perm3 = list(permutations([1,2,3,4],3))

我们根据这些数字创建长度为 3 的所有排列(例如 (1,2,3),(1,3,2),...)。现在,我想找到满足特定条件的所有子集。例如,找到从一开始就没有“3”的所有排列的子集。仅此一项就应该很容易实现:

first_neq_3 = [tuple for tuple in perm3 if tuple[0]!= 3]

但是,显然这只给了我一个子集 - 即 "biggest" 一个。现在,我想找到满足此条件的所有子集。一个简短的例子,假设 first_neq_3 = [(1,2,3),(2,1,3),(1,3,2),(2,3,1)] - 那么我也会喜欢查找 [(1,2,3),(2,1,3)] 等等。
我承认,对于所提供的示例来说,这是一个非常简单的问题,但我被卡住了,并且在更复杂的条件下变得更加复杂。

如果我没理解错的话,您需要上面列表 first_neq_3 的所有子集(所有可能的长度)。然后你可以使用下面的代码获取它们

from itertools import combinations
sum(map(lambda r: list(combinations(first_neq_3, r)), range(1, len(first_neq_3)+1)), [])

解释

这里的关键是map函数。 itertools.combinations 为您提供给定长度的 list 的所有子集。由于我们需要所有长度的子集,因此我们使用 r 作为虚拟变量 运行 在所有可能的长度上执行该操作。由于 map 的第一个参数必须是函数,因此使用 lambda 表达式很方便。