python - 来自两个或多个数字的 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) 处选择它们。但是,这很容易遇到内存问题......谢谢
解决方案
在字符串上使用 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']
推荐阅读
- php - 如何在PHP中dislpay所有状态= 1的动物
- anylogic - 如何在anylogic中修复“迭代期间模型中的错误”
- python - 在基于 Python 的原始“浏览器”中使用用户的输入作为主机
- node.js - 当我尝试在其上运行节点文件时,猫鼬连接未打开
- laravel - 如果 composer.json 上的符号链接设置为 true,Laravel Nova 工具将不会更新
- python - 如何通过内存和迭代加深提高我的 alpha beta 剪枝 minimax 算法的性能
- r - R:使用带有数字类型值的开关功能?
- python - SVD 在 scipy 中不能像预期的那样使用复杂的矩阵?
- sql - 使用 CHARINDEX 查找字符串
- html - 是否可以仅使用 HTML 和 CSS 在同一页面上拥有两个模式窗口?