簡體   English   中英

Python-驗證生成的電源集

[英]Python- validate generated powerset

我只想基於“ <>”中的數據來驗證生成的組合。

我有一張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-

請幫助我找到一種通用方法來驗證基於<>生成的所有冪集。

舉一個簡單的例子:我有下面的list1。

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

list1是以下各項的所有可能組合:

<A><B>-CAT-DOG

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

我們可以使用itertools.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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM