Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用每个字符的一定数量生成字符序列_Python_Combinations_Sequence - Fatal编程技术网

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

Python 使用每个字符的一定数量生成字符序列,python,combinations,sequence,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)

因此,我目前正在使用以下命令生成字符串形式的字符序列:

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
但我现在显然遇到了一个类型错误,我甚至不确定这是否是检索所有排列而不使用种子重复的最佳途径。

只需执行以下操作:

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

更新: 这就是我最后要做的:

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。

为了避免重复,更好的方法是使用@BillBell在这里指出的正确工具:。本质上,我们正在处理,使用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

那么你想要的输出是什么呢?“ABBBC”的所有排列都没有重复?是的,你搞定了!您应该在shuffle上迭代。在seed上迭代将破坏PRNG提供的任何保证。您应该发布您的工作代码作为您自己问题的答案,而不是将其编辑到问题本身中。抱歉,完成!那会有重复的。哦,对不起。“让我来修好它。”施沃巴塞格修好了!更好,但对于重复次数较多的较长序列,这将导致显著的生产过剩。理想情况下,这将是可扩展的。不过,您的解决方案确实适用于较小的序列!!