我想仅根据“<>”中的数据验证生成的组合。
我有一张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是否有效
答案 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