将itertools.filterfalse对象转换为列表的最佳方法

2024-06-08 19:36:41 发布

您现在位置:Python中文网/ 问答频道 /正文

我一直在到处寻找对itertools.filterfalse的深入了解,但对于我的特定问题,运气并不好

下面是一个场景:我有一组48个对象,我使用itertools.combines从这个集合生成所有9个对象的组合

问题1:如何在不将itertools.combinations对象转换为列表的情况下计算该对象中的项数?itertools文档提供了这方面的公式(大约21亿个组合),但我很想知道是否有任何内置方法可以返回值

生成48-choose-9的这些组合后,我使用itertools.filterfalse函数对它们进行过滤。为了让您了解这个过滤器有多严格,当我对33-choose-7个相似对象的组合执行相同的步骤时,只剩下28个。所以,当我做48-choose-9时,我期望值的数量也同样少

脚本在48-choose-9秒内完成,filterfalse将过滤后的组合返回到一个变量中:

valid_combinations = itertools.filterfalse(
    lambda combination: set([action for tile in combination for action in tile])
    != set(total_actions),
    all_combinations,
)

valid_combinations应该是一个简短的列表,但是我的计算机在我尝试时会大声运行几分钟而没有返回任何内容:

valid_combinations = list(valid_combinations)

问题2:如何计算itertools.filterfalse对象中的项数,以确认它确实是一个可管理的数字

问题3:如何在不转换为列表的情况下获取itertools.filterfalse对象有效组合的内容

问题4:是否有更好的方法来过滤这种大小的itertools.combines对象

谢谢你能寄给我的任何见解


Tags: 对象方法列表for情况actionitertoolsset