首页 > 解决方案 > 来自两个或多个数字的 n 长度组合,具有重复限制

问题描述

我有字母 a 和 b ,我想从中取 n 个长度组合,其中 a 和 b 有重复限制。

例如,如果 n = 7、a = 4 和 b = 3,则可能期望的结果以“b”开头:

bbbaaaa
bbabaaa
bbaabaa
bbaaaba
bbaaaab
babbaaa
bababaa
babaaba
babaaab
baabbaa
baababa
baabaab
baaabba
baaabab
baaaabb

我研究了很多 python 和 c 函数,但没有一个完全符合我的要求,而且我不知道如何更改/使用它们来这样做。

我最初想到的是存储所有可能的组合,然后在其中 a=(length) 处选择它们。但是,这很容易遇到内存问题......谢谢

标签: pythoncombinations

解决方案


在字符串上使用 itertools.permutations() 'aaaabbb'。它不是“有效的”,您需要删除重复项。

from itertools import permutations

for l in set(permutations('a'*4 + 'b'*3, 7)):
    print(*l, sep='')
babbaaa
abaabba
bbaaaab
aaabbba
ababaab
abaaabb
baaaabb
babaaba
aababba
baaabba
aabbaab
abbbaaa
abbaaba
baababa
bababaa
aabaabb
aaabbab
abaabab
bbabaaa
baaabab
aaaabbb
aabbbaa
bbbaaaa
baabbaa
babaaab
aababab
abbabaa
bbaaaba
abababa
baabaab
aaababb
abbaaab
bbaabaa
ababbaa
aabbaba

泛化为一个函数:

from itertools import permutations

def f(**kwargs):
    population = ''.join(s*n for s,n in kwargs.items())
    return (''.join(l) for l in set(permutations(population, len(population))))

>>> f(a=3, b=4)
<generator object f.<locals>.<genexpr> at 0x7fc1ec51fd60>

>>> list(f(a=3, b=4))
['aabbabb', 'bbaaabb', 'bbbbaaa', 'aaabbbb', 'bbbaaab', 'abaabbb', 'bbbaaba', 'baabbab', 'babbaab', 'bbabbaa', 'babaabb', 'babbaba', 'baaabbb', 'aabbbab', 'aabbbba', 'baabbba', 'bbaabab', 'baababb', 'bbabaab', 'aababbb', 'abbbbaa', 'bbaabba', 'bbababa', 'abbabab', 'abababb', 'bababab', 'abbabba', 'bababba', 'abbbaab', 'abbbaba', 'abbaabb', 'babbbaa', 'bbbabaa', 'ababbab', 'ababbba']
>>> print(*(f(a=3, b=4)))
aabbabb bbaaabb bbbbaaa aaabbbb bbbaaab abaabbb bbbaaba baabbab babbaab bbabbaa babaabb babbaba baaabbb aabbbab aabbbba baabbba bbaabab baababb bbabaab aababbb abbbbaa bbaabba bbababa abbabab abababb bababab abbabba bababba abbbaab abbbaba abbaabb babbbaa bbbabaa ababbab ababbba

>>> list(f(a=1,b=1,c=1))
['cab', 'bac', 'abc', 'acb', 'bca', 'cba']

推荐阅读