String 如何在给定值列表时生成字符串的所有可能组合

String 如何在给定值列表时生成字符串的所有可能组合,string,language-agnostic,cross-platform,String,Language Agnostic,Cross Platform,假设我有一个值列表,该列表可以是任意长度: "100","200","300","400","500", ... 我有一个模板字符串,其中有一些令牌需要替换: "@token1@-@token2@-@token3@-....-@tokenN@" 使用值列表,如何在模板中生成所有可能的值组合 值可以多次使用,因此结果可能是“100-100-100”。考虑了可变数量令牌的方法的额外点数 编辑:删除固定数量的令牌版本 利用递归,只是为了好玩: r($values,false,$numtokens)

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

"100","200","300","400","500", ...
我有一个模板字符串,其中有一些令牌需要替换:

"@token1@-@token2@-@token3@-....-@tokenN@"
使用值列表,如何在模板中生成所有可能的值组合


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

编辑:删除固定数量的令牌版本

利用递归,只是为了好玩:

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;
            }
    }
}
(这可能需要对不同语言进行一些调整)

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”为例,可以进行组合而不是排列。

假设值可以重复:

#!/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)

可以多次使用值吗?3个托克的数量是否固定?值可以多次使用,这意味着结果可能是:100-100-100。令牌也不是固定的。如果您的值列表真的可以是任意长度的,那么请做好长时间等待的准备,因为N的排列数是N!(即阶乘N)。这会变得非常大,非常快,对于中等大小的列表(比如20-30),生成所有组合所需的时间可能会超过整个宇宙的寿命。这是否假设带有标记的模板字符串始终使用连字符格式?它基本上为您提供了一个元素数组,您可以将其用于任何用途<代码>内爆(“-”,$collect)意味着在元素之间用
-
将它们连接起来。当然,在这一点上你可以做任何事情-
$template=“@token0@.."; foreach($collect as$id=>$el)$template=str_replace(“@token$id@,$el$template”)例如(注意:第一个元素id 0!)