发布
社区首页 >问答首页 >Python中的Power集操作

Python中的Power集操作
EN

Stack Overflow用户
提问于 2018-04-05 11:07:04
回答 5查看 695关注 0票数 0

我在操作一个集合,所以如果你有一个n个不同元素的集合(也就是:列表),那么你就有了2^n个子集。在这里,我展示了如何:

代码语言:javascript
代码运行次数:0
复制
def powerset(s):
    x = len(s)
    masks = [1 << i for i in range(x)]
    for i in range(1 << x):
        yield [ss for mask, ss in zip(masks, s) if i & mask]

l = list(powerset(["A", "B"]))
print(l) 

这意味着:

代码语言:javascript
代码运行次数:0
复制
[[], ['A'], ['B'], ['A', 'B']]

现在,如何使用上面的列表消除空列表,并合并最后一个元素,使其成为:

代码语言:javascript
代码运行次数:0
复制
['A', 'B', 'AB']

我想重复这个过程5次,获取最后的输出并编写它的子列表,消除空列表并合并它们属于同一子列表的元素。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2018-04-05 11:29:38

要摆脱空集,只需使用1而不是0启动循环,然后使用''.join

代码语言:javascript
代码运行次数:0
复制
def powerset(s):
    x = len(s)
    masks = [1 << i for i in range(x)]
    for i in range(1, 1 << x):
        yield ''.join(ss for mask, ss in zip(masks, s) if i & mask)

如果要重复此操作,即获取原始列表的powerset的powerset,只需将结果反馈回循环中的函数:

代码语言:javascript
代码运行次数:0
复制
lst = ["A", "B"]
for _ in range(5):
    lst = list(powerset(lst))
    print(lst)

尽管如此,将这种过滤和加入作为后处理步骤(如@L3viathan的答案)可能更有意义,因为真正的powerset函数不应忽略或修改结果。

票数 1
EN

Stack Overflow用户

发布于 2018-04-05 11:10:43

首先,过滤掉falsy (空)元素,然后加入其余元素的元素:

代码语言:javascript
代码运行次数:0
复制
>>> l = [[], ['A'], ['B'], ['A', 'B']]
>>> list(map(''.join, filter(bool, l)))
['A', 'B', 'AB']

同等清单-理解方式:

代码语言:javascript
代码运行次数:0
复制
>>> l = [[], ['A'], ['B'], ['A', 'B']]
>>> [''.join(e) for e in l if e]
['A', 'B', 'AB']

做五次,做五次:

代码语言:javascript
代码运行次数:0
复制
start = ["A", "B"]
for _ in range(5):
    start = [''.join(e) for e in powerset(start) if e]
票数 1
EN

Stack Overflow用户

发布于 2018-04-05 11:46:37

代码语言:javascript
代码运行次数:0
复制
data = [[], ['A'], ['B'], ['A', 'B']]
list(filter(None,map(lambda x:''.join(x) if x else None, data)))
>>>['A', 'B', 'AB']
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49670868

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档