【问题标题】:Python find subsets of a list of lists that fulfil a specific conditionPython 查找满足特定条件的列表列表的子集
【发布时间】:2018-07-04 15:32:45
【问题描述】:

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

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

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

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]

但是,显然这只给了我一个子集——即“最大”的一个。现在,我想找到满足这个条件的所有子集。一个简短的例子,假设 first_neq_3 = [(1,2,3),(2,1,3),(1,3,2),(2,3,1)] - 那么我也想找到 [ (1,2,3),(2,1,3)] 等等。
我承认,对于所提供的示例来说,这是一个非常简单的问题,但我被卡住了,而且条件越复杂,问题就越复杂。

【问题讨论】:

    标签: python list subset criteria


    【解决方案1】:

    如果我理解正确,您需要上面列表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 表达式很方便。

    【讨论】:

    • 你确实理解我的意思。是的,该功能完全符合我的要求!我只是想知道,您是否知道了解 Lambda 函数的好链接,以及您是否解释了为什么您知道/想到在这种情况下使用它?我猜的经验?
    • 我在回答中添加了更多解释
    猜你喜欢
    • 2023-01-04
    • 2020-09-14
    • 2012-01-22
    • 2018-02-26
    • 2021-05-15
    • 2021-01-22
    • 2011-11-16
    • 2020-07-28
    • 2011-11-02
    相关资源
    最近更新 更多