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提供的任何保证。您应该发布您的工作代码作为您自己问题的答案,而不是将其编辑到问题本身中。抱歉,完成!那会有重复的。哦,对不起。“让我来修好它。”施沃巴塞格修好了!更好,但对于重复次数较多的较长序列,这将导致显著的生产过剩。理想情况下,这将是可扩展的。不过,您的解决方案确实适用于较小的序列!!