Как сгенерировать каждую возможную комбинацию строки, когда дан список значений - PullRequest
1 голос
/ 27 июля 2010

Скажем, у меня есть список значений, этот список может быть любой длины:

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

И у меня есть строка шаблона, в которой есть несколько токенов, которые необходимо заменить:

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

Используя список значений, как я могу сгенерировать каждую возможную комбинацию значений в шаблоне?

Значения могут использоваться более одного раза, поэтому результатом может быть «100-100-100». Дополнительные очки за метод, который учитывает переменное количество токенов!

Ответы [ 3 ]

2 голосов
/ 27 июля 2010

edit: удалено фиксированное число версий токенов

рекурсия эксплойта, просто для удовольствия:

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 голос
/ 27 июля 2010

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".

0 голосов
/ 27 июля 2010

Предполагая, что значения могут повторяться:

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