我正在尝试创建一个测试脚本,该脚本将根据多个列表生成每个可能的值排列。但是,对于哪些值可以与其他值匹配存在一些限制。到目前为止,我已经提出以下建议:
fieldTypes = ['Text', 'Float', 'Double', 'Short', 'Long', 'Date']
domainTypes = ['Coded', 'Range']
rangeSplitPolicies = ['Default', 'Duplicate', 'Geometry_Ratio']
rangeMergePolicies = ['Default', 'Area_Weighted', 'Sum_Values']
codedSplitPolicies = ['Default', 'Duplicate']
codedMergePolicies = ['Default']
for fieldType in fieldTypes:
for domainType in domainTypes:
# Skip incompatible domainType-fieldType permutations
if domainType == 'Coded' and fieldType == 'Date' \
or domainType == 'Range' and fieldType == 'Text':
break
# Range domain-type handling
if domainType == 'Range':
for splitPolicy in rangeSplitPolicies:
# Date fields require special handling and only support the
# the default keyword for their split and merge policies
if fieldType == 'Date':
permutation = '{0}-{1}'.format(
fieldType,
domainType,
'Default',
'Default')
else:
for mergePolicy in rangeMergePolicies:
permutation = '{0}-{1}-{2}-{3}'.format(
fieldType,
domainType,
splitPolicy,
mergePolicy)
# Coded-value domain-type handling
else:
for splitPolicy in codedSplitPolicies:
for mergePolicy in codedMergePolicies:
permutation = '{0}-{1}-{2}-{3}'.format(
fieldType,
domainType,
splitPolicy,
mergePolicy)
# Do more stuff...
显然,这不是很优雅。如果可能的话,我想使用一个发电机,因为我只需要进行一次换发,但我真的不确定最好的方法是组织这个并得到每一个可能的排列。 field和domainType以及每个domainType的相应拆分和合并策略,同时强制执行细微限制:
我现在只是将排列变为字符串,但它可以作为元组,列表或任何易于解析的内容返回。
提前感谢任何见解。
答案 0 :(得分:0)
它听起来并不像你真正的排列,而是笛卡尔积。
考虑做以下事情:
def gen(domain_types, field_types):
for d, f in itertools.product(domain_types, field_types):
if is_okay(d, f):
yield d, f
我知道你有更多的领域需要担心,但这个例子应该足够了。