Python:迷你字母表中固定长度的所有可能单词(排列)

时间:2011-07-01 17:30:49

标签: algorithm permutation

假设我有一个像这样的字符串:

abcdefghijklmnopqrstuvwxyz1234567890!@#$%^&*()-_+={}[]\:;"'?/>.<,`~|€

这基本上是键盘上所有字符的列表。我怎么能得到所有可能的组合,比方说,由这些字符中的8个组成的“单词”?我知道会有数百万种可能性。

干杯!

1 个答案:

答案 0 :(得分:8)

排列和组合之间的差异

您正在寻找排列或组合。

'abc''bac'是不同的排列,但它们是相同的组合{a,b,c}

'abc'的排列:'''a''b''c''ab''ba''ac''ca''bc''cb''abc''acb''bac''bca''cab',{ {1}}

'abc'的组合:'cba'{}{'a'}{'b'}{'c'}{'a','b'}{'b','c'}{'a','c'}


在python中

使用{'a','b','c'}(因为那里的函数确实应该在默认命名空间中),或from itertools import *如果您愿意。

如果您关心排列

import itertools

如果您关心组合

permutations(yourString, 8)

其他语言

在其他语言中,有简单的递归或迭代算法来生成这些。请参阅维基百科或stackoverflow。例如http://en.wikipedia.org/wiki/Permutation#Systematic_generation_of_all_permutations


重要提示

请注意,排列的数量为combinations(yourString, 8) ,因此例如您的字符串会

    长度为8的
  • N! 组合,因此......
  • (69 choose 8) = 8 billion 排列长度为8。

如果要存储每个排列,则内存不足。即使你没有(因为你正在减少它们),它也需要很长时间才能运行,可能在现代计算机上的1-10天之间。