[英]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.