不重复Python

时间:2017-06-09 13:29:04

标签: python algorithm math permutation itertools

我希望得到两个不同元素的所有可能排列,这些元素按四个分组而不重复输出但重复元素(显然你需要重复元素来组合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)))))

这给出了预期的输出,但仍然会产生所有的重复,但恰好被过滤掉了因为集合不能有重复的元素,所以它可能不是最有效的方法。

2 个答案:

答案 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']