python - 使用itertools获得大量独特的排列

标签 python python-3.x permutation

我有一个这样的问题:有多少种方法可以改变“avocadojuice”中的字母顺序,以便元音首先出现,例如“ovacadojuice”就是一个解决方案?出发点——“牛油果汁”也是一个解决方案。 我知道itertools.permutations可以做这样的事情,但如果单词太长,就会弹出内存错误。有没有办法防止这种情况,或者也许有另一个内置模块可以解决这个问题?先感谢您! 附:我知道如何将排列元组转换为字符串。

最佳答案

这是一个暴力破解问题可能不可行的情况。您需要计算 n 个元素的唯一排列数量,并考虑到某些元素是重复的。

对此有一个数学公式,并且 some excellent answers在其他堆栈交换站点上。

只有 ao 重复,因此 avocadojuice 的唯一排列数为

(12!) / (2!2!)

119750400

每 12 个字符的字符串大约需要 45 个字节(至少在我的机器上),仅存储近 1.2 亿个排列就需要超过 5 GB 的内存!您会明白为什么暴力破解并不是一个好主意。

不过,您的问题还有一个额外要求,即排列必须以元音开头。鉴于只有 5 个元音,您应该能够计算出每个给定元音作为第一个字符的可能排列。

(11! / 2!) +      # a (only o is repeated)
(11! / (2!2!)) +  # e
(11! / (2!2!)) +  # i
(11! / 2!) +      # o (only a is repeated)
(11! / (2!2!)) +  # u

关于python - 使用itertools获得大量独特的排列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36871110/

相关文章:

计算完全替代的密码排列

python - 我不明白python中的这种递归方法来生成排列

python - numpy .dot 使用列表和数组,有什么区别

Python 字符串到字节的转换。双反斜杠问题

python - 将重定向 URL 的一部分复制为文本

python - 实验 Tensorflow 中的 eval_step 是什么

python - 在 View 中找不到 Django Reverse,但 URL 有效

c++ - visual studio 2010 中失败的预构建事件取消构建

python-3.x - Pyspark 中的 UDF 和 python 函数

arrays - 给定 n,生成大小小于 0.5n 的所有排列