我们可以使用 itertools.product
构建所需的组合,生成 Cartesian product它的可迭代参数。但首先我们需要将输入字符串拆分为其组件。我们可以通过首先添加一些额外的空格,然后调用 .split
来做到这一点。方法。
然后我们可以转换 .split
返回的列表中的每个字符串。成一个元组。 <
包含的项目和>
转换为包含该项目和 'NULL'
的 2 元组字符串,所有其他项都变成 1 元组。
from itertools import product
def make_powerset(base):
# Add some spaces to make splitting easier
s = base.replace('-', ' ').replace('<', ' <').replace('>', '> ')
# Convert items enclosed in <> into 2-tuples and make other items 1-tuples
elements = [(u, 'NULL') if u.startswith('<') else (u,) for u in s.split()]
# Create all the subsets by finding the Cartesian product of all the tuples
return {'-'.join(t).replace('>-<', '><') for t in product(*elements)}
# Tests
# Make a powerset from base
base = '-C(A2)-C(60)---xy1-[address0]-C(D0)-lbr-'
powerset = make_powerset(base)
for t in powerset:
print(t)
print()
# Test if the following data are in the powerset
data = (
'-C(A2)-C(60)--xy1-[address0]-C(D0)-lbr-',
'-C(A2)-C(60)-NULL-xy1-[address0]-C(D0)-lbr-',
'NULL-C(A2)-C(60)--xy1-[address0]-C(D0)-lbr-',
'NULL-C(A2)-C(60)-NULL-xy1-[address0]-C(D0)-lbr-',
'-C(A2)-C(60)-NULL-xy1-[address0]-C(D0)-lbr-',
)
for s in data:
print(s, s.rstrip('-') in powerset)
print('\n', '- ' * 20, '\n')
# Make another powerset
for t in make_powerset('-CAT-DOG'):
print(t)
đầu ra
-C(A2)-C(60)--xy1-[address0]-C(D0)-lbr
NULL-C(A2)-C(60)-NULL-xy1-[address0]-C(D0)-lbr
-C(A2)-C(60)-NULL-xy1-[address0]-C(D0)-lbr
NULL-C(A2)-C(60)--xy1-[address0]-C(D0)-lbr
-C(A2)-C(60)--xy1-[address0]-C(D0)-lbr- True
-C(A2)-C(60)-NULL-xy1-[address0]-C(D0)-lbr- True
NULL-C(A2)-C(60)--xy1-[address0]-C(D0)-lbr- True
NULL-C(A2)-C(60)-NULL-xy1-[address0]-C(D0)-lbr- True
-C(A2)-C(60)-NULL-xy1-[address0]-C(D0)-lbr- False
- - - - - - - - - - - - - - - - - - - -
NULL-NULL-CAT-DOG-NULL
NULL--CAT-DOG-NULL
-NULL-CAT-DOG-
-NULL-CAT-DOG-NULL
NULL-NULL-CAT-DOG-
-CAT-DOG-
NULL--CAT-DOG-
-CAT-DOG-NULL
Tôi là một lập trình viên xuất sắc, rất giỏi!