我希望得到两个不同元素的所有可能排列,这些元素按四个分组而不重复输出但重复元素(显然你需要重复元素来组合4只有2个元素)。
所以,我尝试了一些事情:
sorted(list(map(lambda x: "".join(x), list(permutations('AB', 4)))))
返回一个空列表。所以我尝试了这个:
sorted(list(map(lambda x: "".join(x), list(permutations('AABB', 4)))))
它关闭了我期望的输出,但是充满了多余的项目,只有其中几项:
['AABB','AABB','AABB','AABB','ABAB','ABAB','ABAB',...
我期望得到的是:
['AABB','ABAB','ABBA','BAAB','BABA','BBAA']
我也试过了combination()和product()而不是permutations()但没有成功,但也许我的论点不适合这个问题。
有什么想法吗?
提前多多感谢!
PS。正如Antoine所指出的,有一种使用集合而不是列表的解决方法,例如:
sorted(list(map(lambda x: "".join(x), set(permutations('AABB', 4)))))
这给出了预期的输出,但仍然会产生所有的重复,但恰好被过滤掉了因为集合不能有重复的元素,所以它可能不是最有效的方法。
答案 0 :(得分:6)
您可以使用set
代替列表并获得所需的结果
sorted(set(map(lambda x: "".join(x), list(permutations('AABB', 4)))))
但请注意,对于包中的大量元素,这可能效果不佳。它没有缩放
给出
['AABB', 'ABAB', 'ABBA', 'BAAB', 'BABA', 'BBAA']
或许更多的表现
sorted(map(lambda x: "".join(x), set(permutations('AABB', 4))))
此处列出了排列等效的python代码:https://docs.python.org/2/library/itertools.html#itertools.permutations
原始代码在C中实现,因此运行速度更快。最后,做大量项目的排列根本不会缩放是否遗漏了重复项。
答案 1 :(得分:0)
只是复制并粘贴this answer,我看不出它是如何改进的,所以你应该赞成
def permute_unique(myList):
perms = [[]]
for i in myList:
new_perm = []
for perm in perms:
for j in range(len(perm) + 1):
new_perm.append(perm[:j] + [i] + perm[j:])
# handle duplication
if j < len(perm) and perm[j] == i: break
perms = new_perm
return perms
结果:
>>> sorted(list(map(lambda x: "".join(x), permute_unique('AABB') )))
['AABB', 'ABAB', 'ABBA', 'BAAB', 'BABA', 'BBAA']