【发布时间】:2016-07-23 17:13:14
【问题描述】:
我正在尝试找出一种方法来生成具有几个重复字符但不生成重复元组的字符串的所有可能排列。
现在我正在使用itertools.permutations()。它有效,但我需要删除重复,我不能使用set() 删除重复。
我期待什么样的结果?好吧,例如,我想得到DDRR 的所有组合,itertools.permutations() 的事情是我会得到大约四次DDRR,因为itertools 看到Ds 就好像它们是不同,与Rs 相同。
list(itertools.permutations('DDRR')) 我得到:
[('D', 'D', 'R', 'R'), ('D', 'D', 'R', 'R'), ('D', 'R', 'D', 'R'), ('D', 'R', 'R', 'D'), ('D', 'R', 'D', 'R'), ('D', 'R', 'R', 'D'), ('D', 'D', 'R', 'R'), ('D', 'D', 'R', 'R'), ('D', 'R', 'D', 'R'), ('D', 'R', 'R', 'D'), ('D', 'R', 'D', 'R'), ('D', 'R', 'R', 'D'), ('R', 'D', 'D', 'R'), ('R', 'D', 'R', 'D'), ('R', 'D', 'D', 'R'), ('R', 'D', 'R', 'D'), ('R', 'R', 'D', 'D'), ('R', 'R', 'D', 'D'), ('R', 'D', 'D', 'R'), ('R', 'D', 'R', 'D'), ('R', 'D', 'D', 'R'), ('R', 'D', 'R', 'D'), ('R', 'R', 'D', 'D'), ('R', 'R', 'D', 'D')]
我想要的理想结果是:
[('D', 'R', 'R', 'D'), ('R', 'D', 'R', 'D'), ('R', 'R', 'D', 'D'), ('D', 'R', 'D', 'R'), ('D', 'D', 'R', 'R'), ('R', 'D', 'D', 'R')]
【问题讨论】:
-
为什么无法使用
set?有什么不好的? -
因为我遇到了内存错误。我正在使用非常长的字符串。
-
这是一种设计选择,有一些解决方法,请参阅:stackoverflow.com/questions/6534430/…
-
“非常长的字符串”不是总是会导致不切实际的大输出吗?包含两次字母的 52 个字符的字符串具有超过 10^60 种排列。
-
我已经在那个问题中回答了关于正确性的问题(由弗洛伊德提出)。该算法确实是正确的,但需要对初始输入进行排序。
标签: python algorithm permutation itertools