我在操作一个集合,所以如果你有一个n个不同元素的集合(也就是:列表),那么你就有了2^n个子集。在这里,我展示了如何:
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)
这意味着:
[[], ['A'], ['B'], ['A', 'B']]
现在,如何使用上面的列表消除空列表,并合并最后一个元素,使其成为:
['A', 'B', 'AB']
我想重复这个过程5次,获取最后的输出并编写它的子列表,消除空列表并合并它们属于同一子列表的元素。
发布于 2018-04-05 11:29:38
要摆脱空集,只需使用1
而不是0
启动循环,然后使用''.join
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,只需将结果反馈回循环中的函数:
lst = ["A", "B"]
for _ in range(5):
lst = list(powerset(lst))
print(lst)
尽管如此,将这种过滤和加入作为后处理步骤(如@L3viathan的答案)可能更有意义,因为真正的powerset
函数不应忽略或修改结果。
发布于 2018-04-05 11:10:43
首先,过滤掉falsy (空)元素,然后加入其余元素的元素:
>>> l = [[], ['A'], ['B'], ['A', 'B']]
>>> list(map(''.join, filter(bool, l)))
['A', 'B', 'AB']
同等清单-理解方式:
>>> l = [[], ['A'], ['B'], ['A', 'B']]
>>> [''.join(e) for e in l if e]
['A', 'B', 'AB']
做五次,做五次:
start = ["A", "B"]
for _ in range(5):
start = [''.join(e) for e in powerset(start) if e]
发布于 2018-04-05 11:46:37
data = [[], ['A'], ['B'], ['A', 'B']]
list(filter(None,map(lambda x:''.join(x) if x else None, data)))
>>>['A', 'B', 'AB']
https://stackoverflow.com/questions/49670868
复制相似问题