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

时间:2016-04-26 16:52:01

标签: python python-3.x permutation

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

1 个答案:

答案 0 :(得分:1)

这是一个粗暴的案例,可能是不可行的问题。您需要计算 n 元素的唯一排列的数量,以解释某些元素重复的事实。

有一个数学公式,some excellent answers在其他堆栈交换网站上。

仅重复ao,因此avocadojuice的唯一权限数

(12!) / (2!2!)

119750400

每个12个字符的字符串大约45 bytes(至少在我的机器上),超过5 gig的内存只是为了存储近1.2亿个排列!你可以看出为什么暴力强迫这不是一个好主意。

你的问题还有一个额外的要求,那就是排列必须以元音开头。鉴于只有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