生成具有一定数量的每个字符的字符序列

时间:2018-12-12 02:16:09

标签: python combinations sequence

所以我目前正在使用以下命令将字符序列生成为字符串:

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 :(得分:1)

只需执行以下操作:

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的值是所有可能组合的列表。

答案 1 :(得分:0)

更新: 所以这就是我最终要做的:

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循环遍历了shuffle。

答案 2 :(得分:0)

一种避免重复的更好方法是使用@BillBell在此处指出的正确工具:permutations with unique values。从本质上讲,我们正在处理 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