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

所以我目前正在使用以下方法生成一系列字符作为字符串:


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,我什至不确定这是否是检索所有排列而不用种子重复的最佳途径。


牧羊人nacy
浏览 226回答 3
3回答

陪伴而非守候

只需这样做:import itertoolsmatch = 'ABBBC' #string of letter combinations to match.permutations = itertools.permutations(match) #get allall_combos = list({''.join(per) for per in permutations}) #use sets to remove duplicates的值all_combos是所有可能组合的列表。

aluckdog

避免重复的更好方法是使用@BillBell 在这里指出的正确工具:具有唯一值的排列。从本质上讲,我们正在处理的多集,并使用sympy我们可以得到想要的结果:from sympy.utilities.iterables import multiset_permutationsfor item in multiset_permutations(listOfCharacters):    print(''.join(item))ABBBCABBCBABCBBACBBBBABBCBABCBBACBBBBABCBBACBBBBACBBBCABBCABBBCBABCABBBCBABBCBBACABBBCBABBCBBABCBBBA

慕姐4208626

更新: 所以这是我最终做的:A = 1B = 3C = 1listOfCharacters = ["A"]*A + ["B"]*B + ["C"]*C>>> ['A', 'B', 'B', 'B', 'C']random.seed(1)random.shuffle(listOfCharacters)listOfCharacters = ''.join(listOfCharacters)>>>'BBCAB'然后我只是用 for 循环遍历 shuffle。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python