我正在寻找一种简单的方法来生成可迭代对象的幂集,其中每个元素可以是"正"或"负",但不能都是同一个组合. 迭代对象中没有重复项,只有元素,或者它是负数. 秩序不重要.

下面是一个int的例子:

可迭代:

elements = [-2, 1]

所需功率集:

[]
[-2]
[2]
[-1]
[1]
[-2, -1]
[-2, 1]
[2, -1]
[2, 1]

"子集"排除:

[-1, 1]
[-2, 2]

我目前的方法是使用here的powerset实现实现elements[-x for x in elements]的组合列表,然后遍历powerset并删除不需要的组合. 但是,这不是最佳的,我猜. 有没有一个简单的解决方案,不需要我在最后删除不需要的组合?

推荐答案

每个元素都可以被包含、包含、否定或排除.使用itertools.product来遍历所有3**len(elements)种可能的方法, for each 元素 Select 一个选项:

import itertools

def extended_powerset(elements):
    elements = list(elements)
    n = len(elements)
    for option in itertools.product([-1, 0, 1], repeat=n):
        yield [i*elem for (i, elem) in zip(option, elements) if i]

Python相关问答推荐

多处理代码在while循环中不工作

在内部列表上滚动窗口

非常奇怪:tzLocal.get_Localzone()基于python3别名的不同输出?

运行Python脚本时,用作命令行参数的SON文本

如何在Python数据框架中加速序列的符号化

PyQt5,如何使每个对象的 colored颜色 不同?'

如何将多进程池声明为变量并将其导入到另一个Python文件

pandas:排序多级列

形状弃用警告与组合多边形和多边形如何解决

使用Python查找、替换和调整PDF中的图像'

在单次扫描中创建列表

在极中解析带有数字和SI前缀的字符串

在Python中使用yaml渲染(多行字符串)

(Python/Pandas)基于列中非缺失值的子集DataFrame

Python pint将1/华氏度转换为1/摄氏度°°

如何过滤组s最大和最小行使用`transform`'

如何将返回引用的函数与pybind11绑定?

提取最内层嵌套链接

有没有一种方法可以在朗肯代理中集成向量嵌入

如何获取给定列中包含特定值的行号?