Python-验证生成的powerset

时间:2018-05-04 10:22:35

标签: python

我想仅根据“<>”中的数据验证生成的组合。

我有一张excel表,其中包含基于“<>”生成的所有可能组合条件:    以下是该示例:

    [<Pen(x)>-C(A2)-C(60)-<jack(c)>-xy1-[dress0]-C(D0)-lbr-]
    [<Pen(x)>-C(A2)-C(60)-NULL-xy1-[dress0]-C(D0)-lbr-]
    [NULL-C(A2)-C(60)-<jack(c)>-xy1-[dress0]-C(D0)-lbr-]
    [NULL-C(A2)-C(60)-NULL-xy1-[dress0]-C(D0)-lbr-]

我想检查生成的组合是否有效。    例如:对于上面的列表,生成组合之前的原始字符串如下:

    <Pen(x)>-C(A2)-C(60)--<jack(c)>-xy1-[address0]-C(D0)-lbr-

请帮我找一个通用的方法来验证基于&lt;&gt;生成的所有powersets。

举一个简单的例子:     我有以下列表1。

[<A><B>-CAT-DOG]
[NULL-<B>-CAT-DOG]
[<A>-NULL-CAT-DOG]
[NULL-NULL-CAT-DOG]

list1是所有可能的组合:

<A><B>-CAT-DOG

我想检查上面的list1是否有效

1 个答案:

答案 0 :(得分:3)

我们可以使用itertools.product构建所需的组合,Cartesian product生成其可迭代参数的{{3}}。但首先我们需要将输入字符串拆分为其组件。我们可以通过首先添加一些额外的空格然后调用.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 = '<Pen(x)>-C(A2)-C(60)--<jack(c)>-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 = (
    '<Pen(x)>-C(A2)-C(60)-<jack(c)>-xy1-[address0]-C(D0)-lbr-',
    '<Pen(x)>-C(A2)-C(60)-NULL-xy1-[address0]-C(D0)-lbr-',
    'NULL-C(A2)-C(60)-<jack(c)>-xy1-[address0]-C(D0)-lbr-',
    'NULL-C(A2)-C(60)-NULL-xy1-[address0]-C(D0)-lbr-',
    '<Pen(y)>-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('<A><B>-CAT-DOG<C>'):
    print(t)

<强>输出

<Pen(x)>-C(A2)-C(60)-<jack(c)>-xy1-[address0]-C(D0)-lbr
NULL-C(A2)-C(60)-NULL-xy1-[address0]-C(D0)-lbr
<Pen(x)>-C(A2)-C(60)-NULL-xy1-[address0]-C(D0)-lbr
NULL-C(A2)-C(60)-<jack(c)>-xy1-[address0]-C(D0)-lbr

<Pen(x)>-C(A2)-C(60)-<jack(c)>-xy1-[address0]-C(D0)-lbr- True
<Pen(x)>-C(A2)-C(60)-NULL-xy1-[address0]-C(D0)-lbr- True
NULL-C(A2)-C(60)-<jack(c)>-xy1-[address0]-C(D0)-lbr- True
NULL-C(A2)-C(60)-NULL-xy1-[address0]-C(D0)-lbr- True
<Pen(y)>-C(A2)-C(60)-NULL-xy1-[address0]-C(D0)-lbr- False

 - - - - - - - - - - - - - - - - - - - -  

NULL-NULL-CAT-DOG-NULL
NULL-<B>-CAT-DOG-NULL
<A>-NULL-CAT-DOG-<C>
<A>-NULL-CAT-DOG-NULL
NULL-NULL-CAT-DOG-<C>
<A><B>-CAT-DOG-<C>
NULL-<B>-CAT-DOG-<C>
<A><B>-CAT-DOG-NULL