Python验证生成的能力

2024-10-02 20:39:22 发布

您现在位置: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-

请帮助我找到一个通用方法来验证基于<;>;生成的所有powerset;。你知道吗

举个简单的例子: 我有下面的清单。你知道吗

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

列表1是所有可能的组合:

<A><B>-CAT-DOG

我想检查一下上面的列表1是否有效


Tags: 数据ltgta2列表null例子cat
1条回答
网友
1楼 · 发布于 2024-10-02 20:39:22

我们可以使用^{}构建所需的组合,它生成其iterable参数的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 = '<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

相关问题 更多 >