Генерация всех возможных строк из списка токенов - PullRequest
6 голосов
/ 30 октября 2010

У меня есть список токенов, например:

hel
lo
bye

, и я хочу сгенерировать все возможные комбинации таких строк, например:

hello
lohel
helbye
byehel
lobye
byelo

Язык не важен,Любой совет?

Я нашел Генерация перестановок с использованием bash , но это делает перестановку в одной строке.

Ответы [ 8 ]

18 голосов
/ 30 октября 2010

Ваш пример может быть написан на Python как

from itertools import combinations
print list(combinations(["hel", "lo", "bye"], 2))

Чтобы снова объединить вывод в строки:

print ["".join(a) for a in combinations(["hel", "lo", "bye"], 2)]

Если вы заинтересованы в фактической реализации этой функции, посмотрите документацию .

6 голосов
/ 30 октября 2010

itertools.permutations может сделать это для вас.

>>> l = ['hel', 'lo', 'bye']
>>> list(itertools.permutations(l, 2))
[('hel', 'lo'), ('hel', 'bye'), ('lo', 'hel'), ('lo', 'bye'), ('bye', 'hel'), ('bye', 'lo')]

Или, если вы хотите комбинации, вы можете использовать itertools.combinations.

>>> l = ['hel', 'lo', 'bye']
>>> list(itertools.combinations(l, 2))
[('hel', 'lo'), ('hel', 'bye'), ('lo', 'bye')]
3 голосов
/ 30 октября 2010

Учитывая, что приемлемы другие языки:

#!/usr/bin/perl

use strict; use warnings;
use Algorithm::Combinatorics qw(permutations);

my $data = [ qw( hel lo bye ) ];
my $it = permutations($data);

while ( my $p = $it->next ) {
    print @$p, "\n";
}
hellobye
helbyelo
lohelbye
lobyehel
byehello
byelohel
2 голосов
/ 30 октября 2010
a = ['hel', 'lo', 'bye']
print '\n'.join(''.join(x) for x in itertools.permutations(a, 2))
1 голос
/ 30 октября 2010

выглядит так, как вы хотите permutations:

from itertools import permutations

# easy way to make a list for words
words = 'hel lo bye'.split()

# fetch two-word permutations, joined into a string
for word in [''.join(s) for s in permutations(words,2)]:
    print word

Выход:

hello
helbye
lohel
lobye
byehel
byelo
1 голос
/ 30 октября 2010

Python также имеет перестановок . :)

1 голос
/ 30 октября 2010

Easy в python с помощью itertools.

Вот пример перестановки токена:

import itertools

tokens = ["hel", "lo", "bye"]

for i in range(1, len(tokens) + 1):
    for p in itertools.permutations(tokens, i):
        print "".join(p)

Кроме того, каждый символ рассматривается как токен:

import itertools

tokens = ["hel", "lo", "bye"]

chars = "".join(tokens)
for i in range(1, len(chars) + 1):
    for p in itertools.permutations(chars, i):
        print "".join(p)
0 голосов
/ 30 октября 2010

Обновление: Понятно, я не был достаточно явным.

Haskell имеет функцию перестановок , которая поможет:

import Data.List
permutations ["hel","lo","bye"] ==
[["hel","lo","bye"],["lo","hel","bye"],["bye","lo","hel"],
 ["lo","bye","hel"],["bye","hel","lo"],["hel","bye","lo"]]

Если вы хотите объединить каждую перестановку, используйте

map concat (permutations ["hel","lo","bye"]) ==
["hellobye","lohelbye","byelohel","lobyehel","byehello","helbyelo"]

Если вы действительно хотите комбинаций двух подстрок (как в примере с вашим примером) вместо всех перестановок подстрок, как заметил @Sven, используйте модуль Math.Combinatorics.Graph :

map concat (combinationsOf 2 ["hel","lo","bye"])

Это соответствует вашим примерным данным в некоторых отношениях, но не в других. Я мог бы продолжить рассуждать о том, что вам нужны «все возможные строки», как говорится в заголовке, или все перестановки подмножеств с двумя токенами, или что у вас есть, но рассуждать бессмысленно, поскольку вы уже приняли ответ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...