如何在给定值列表时生成字符串的每个可能组合

时间:2010-07-27 14:55:05

标签: string language-agnostic cross-platform

假设我有一个值列表,这个列表可以是任意长度:

"100","200","300","400","500", ...

我有一个模板字符串,其中包含一些需要替换的标记:

"@token1@-@token2@-@token3@-....-@tokenN@"

使用值列表,如何在模板中生成每个可能的值组合?

值可以多次使用,因此结果可能是“100-100-100”。考虑可变数量令牌的方法的额外分数!

3 个答案:

答案 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)