假设我有一个值列表,这个列表可以是任意长度:
"100","200","300","400","500", ...
我有一个模板字符串,其中包含一些需要替换的标记:
"@token1@-@token2@-@token3@-....-@tokenN@"
使用值列表,如何在模板中生成每个可能的值组合?
值可以多次使用,因此结果可能是“100-100-100”。考虑可变数量令牌的方法的额外分数!
答案 0 :(得分:2)
编辑:删除固定数量的令牌版本
利用递归,只是为了好玩:
r($values,false,$numtokens); // false to get 100-100-100 as well.
function r($values,$unique=true,$depth=3,$collect=array())
{
if ( $depth == 0 )
{
print implode("-",$collect)."\n";
} else {
foreach ( $values as $id=>$t )
{
if ( $unique ) unset($values[$id]);
r($values,$unique,$depth-1,array_merge($collect,array($t)));
if ( $unique ) $values[$id] = $t;
}
}
}
(这可能需要对不同的语言进行一些调整)
答案 1 :(得分:1)
的Python:
from itertools import permutations
list_of_values = ["100","200","300","400","500"]
template = "%s-%s-%s"
for p in permutations(list_of_values,3):
print(template % p)
如果您不想要“500-400-300”和“300-400-500”作为示例,则可以进行组合而不是排列。
答案 2 :(得分:0)
假设值可以重复:
#!/usr/bin/env python
VALUES=['100','200','300','400','500']
TOKEN='@token%d@'
TARGET="@token1@-@token2@-@token3@"
def rep(n,target):
src=TOKEN%n
if src not in target:
return [target]
ret = []
for v in VALUES:
ret += rep(n+1, target.replace(src,v))
return ret
print rep(1,TARGET)