Генерация последовательности персонажей с определенным количеством каждого персонажа - PullRequest
0 голосов
/ 12 декабря 2018

Таким образом, в настоящее время я генерирую последовательность символов в виде строки, используя:

def nth(lists, num):
    res = []
    for a in lists:
        res.insert(0, a[num % len(a)])
        num //= len(a)
    return res

def generate_page(chars, length, iteration):
    result = nth([chars] * length, iteration)
    return "".join(result)

length = 15
seed = 16
number = generate_page('0123456789ABC', length, seed)

Но что я не могу обернуть, так это как генерировать последовательность символов, если я знаю, какбольшая часть каждого символа, который я хочу.

Например, скажем, я хочу сгенерировать последовательность, которая имела бы 1 "A", 3 "B" и 1 "C", как я мог добраться до любой договоренностииз "ABBBC"?

Я думаю, я бы просто конкатенировал список сумм, которые я знаю, я хочу, и затем расшифровал их как:

A = 1
B = 3
C = 1
listOfCharacters = ["A"]*A + ["B"]*B + ["C"]*C
>>> ['A', 'B', 'B', 'B', 'C']
random.seed(1)
listOfCharacters = random.shuffle(listOfCharacters)
>>> None
listOfCharacters = ''.join(listOfCharacters)
>>> TypeError

Но, очевидно, получаю ошибку TypeErrorна данный момент, и я даже не уверен, является ли это лучшим путем для получения всех перестановок без повторов с начальным числом.

Ответы [ 3 ]

0 голосов
/ 12 декабря 2018

ОБНОВЛЕНИЕ: Итак, вот что я закончил делать:

A = 1
B = 3
C = 1
listOfCharacters = ["A"]*A + ["B"]*B + ["C"]*C
>>> ['A', 'B', 'B', 'B', 'C']
random.seed(1)
random.shuffle(listOfCharacters)
listOfCharacters = ''.join(listOfCharacters)
>>>'BBCAB'

А потом я просто перебрал тасование с циклом for.

0 голосов
/ 12 декабря 2018

Лучшим подходом для избежания дублирования является использование правильного инструмента, как указано здесь @BillBell: перестановок с уникальными значениями .По сути, мы имеем дело с Multisets , и, используя sympy , мы можем получить желаемый результат:

from sympy.utilities.iterables import multiset_permutations

for item in multiset_permutations(listOfCharacters):
    print(''.join(item))

ABBBC
ABBCB
ABCBB
ACBBB
BABBC
BABCB
BACBB
BBABC
BBACB
BBBAC
BBBCA
BBCAB
BBCBA
BCABB
BCBAB
BCBBA
CABBB
CBABB
CBBAB
CBBBA
0 голосов
/ 12 декабря 2018

Просто сделайте это:

import itertools
match = 'ABBBC' #string of letter combinations to match.
permutations = itertools.permutations(match) #get all
all_combos = list({''.join(per) for per in permutations}) #use sets to remove duplicates

Значения all_combos - это список всех возможных комбинаций.

...