【问题标题】:Python non-unique permutations processing [duplicate]Python非唯一排列处理[重复]
【发布时间】:2018-12-13 16:32:53
【问题描述】:

我有一个问题,我正在尝试使用itertools 产品解决。这是一个排列问题,但值不是唯一的,例如:

list = [1,1,2,2,3,3]
#result should be
[1,2,1,2,3,3], [2,2,1,1,3,3], .....

我尝试使用set(itertools.permutations(list))这是一个简单的答案,但是对于不同的值和长列表来说,它的处理时间太长了。 我也试过x = itertools.product(set(list),repeat=len(list)) 然后从不满足原始列表值计数的项目中清除x(即生成的列表必须有两个1、两个2 和两个3),这个解决方案更快但是这个答案会抛出大量数字的MemoryError,因为它会尝试将输出存储在内存中,然后对其进行处理。

我还尝试循环遍历产品结果(即for i in itertools.product(set(list),repeat=len(list)) 并选择要存储的迭代以及要丢弃的迭代),这个解决方案解决了内存错误问题,但几乎和第一个一样慢,在代码可以运行几个小时。

有没有人有任何建议如何更有效地解决这个问题?

【问题讨论】:

  • 这些被称为多重集,sympy 已经有一个用于此目的的工具。

标签: python python-3.x combinations permutation itertools


【解决方案1】:

这就是我可能会如何解决这个问题。获取每个唯一的起始值,然后从删除了起始值的值中获取所有唯一组合。它避免生成任何重复项,但只存储每个位置使用的唯一值,因此最坏的情况是,n 元素列表在内存中是 n 平方的。

导入迭代工具

def unique_permutations(values):
    if not values:
        yield []
        return
    seen = set()
    for idx, first in enumerate(values):
        if first in seen:
            continue
        seen.add(first)

        rest = values[:idx] + values[idx+1:]
        for perm in unique_permutations(rest):
            yield [first] + perm

values = [1, 1, 2, 2, 3, 3]
for perm in unique_permutations(values):
    print(perm)

输出:

[1, 1, 2, 2, 3, 3]
[1, 1, 2, 3, 2, 3]
[1, 1, 2, 3, 3, 2]
[1, 1, 3, 2, 2, 3]
[1, 1, 3, 2, 3, 2]
[1, 1, 3, 3, 2, 2]
[1, 2, 1, 2, 3, 3]
[1, 2, 1, 3, 2, 3]
[1, 2, 1, 3, 3, 2]
[1, 2, 2, 1, 3, 3]
[1, 2, 2, 3, 1, 3]
[1, 2, 2, 3, 3, 1]
[1, 2, 3, 1, 2, 3]
[1, 2, 3, 1, 3, 2]
[1, 2, 3, 2, 1, 3]
[1, 2, 3, 2, 3, 1]
[1, 2, 3, 3, 1, 2]
[1, 2, 3, 3, 2, 1]
[1, 3, 1, 2, 2, 3]
[1, 3, 1, 2, 3, 2]
[1, 3, 1, 3, 2, 2]
[1, 3, 2, 1, 2, 3]
[1, 3, 2, 1, 3, 2]
[1, 3, 2, 2, 1, 3]
[1, 3, 2, 2, 3, 1]
[1, 3, 2, 3, 1, 2]
[1, 3, 2, 3, 2, 1]
[1, 3, 3, 1, 2, 2]
[1, 3, 3, 2, 1, 2]
[1, 3, 3, 2, 2, 1]
[2, 1, 1, 2, 3, 3]
[2, 1, 1, 3, 2, 3]
[2, 1, 1, 3, 3, 2]
[2, 1, 2, 1, 3, 3]
[2, 1, 2, 3, 1, 3]
[2, 1, 2, 3, 3, 1]
[2, 1, 3, 1, 2, 3]
[2, 1, 3, 1, 3, 2]
[2, 1, 3, 2, 1, 3]
[2, 1, 3, 2, 3, 1]
[2, 1, 3, 3, 1, 2]
[2, 1, 3, 3, 2, 1]
[2, 2, 1, 1, 3, 3]
[2, 2, 1, 3, 1, 3]
[2, 2, 1, 3, 3, 1]
[2, 2, 3, 1, 1, 3]
[2, 2, 3, 1, 3, 1]
[2, 2, 3, 3, 1, 1]
[2, 3, 1, 1, 2, 3]
[2, 3, 1, 1, 3, 2]
[2, 3, 1, 2, 1, 3]
[2, 3, 1, 2, 3, 1]
[2, 3, 1, 3, 1, 2]
[2, 3, 1, 3, 2, 1]
[2, 3, 2, 1, 1, 3]
[2, 3, 2, 1, 3, 1]
[2, 3, 2, 3, 1, 1]
[2, 3, 3, 1, 1, 2]
[2, 3, 3, 1, 2, 1]
[2, 3, 3, 2, 1, 1]
[3, 1, 1, 2, 2, 3]
[3, 1, 1, 2, 3, 2]
[3, 1, 1, 3, 2, 2]
[3, 1, 2, 1, 2, 3]
[3, 1, 2, 1, 3, 2]
[3, 1, 2, 2, 1, 3]
[3, 1, 2, 2, 3, 1]
[3, 1, 2, 3, 1, 2]
[3, 1, 2, 3, 2, 1]
[3, 1, 3, 1, 2, 2]
[3, 1, 3, 2, 1, 2]
[3, 1, 3, 2, 2, 1]
[3, 2, 1, 1, 2, 3]
[3, 2, 1, 1, 3, 2]
[3, 2, 1, 2, 1, 3]
[3, 2, 1, 2, 3, 1]
[3, 2, 1, 3, 1, 2]
[3, 2, 1, 3, 2, 1]
[3, 2, 2, 1, 1, 3]
[3, 2, 2, 1, 3, 1]
[3, 2, 2, 3, 1, 1]
[3, 2, 3, 1, 1, 2]
[3, 2, 3, 1, 2, 1]
[3, 2, 3, 2, 1, 1]
[3, 3, 1, 1, 2, 2]
[3, 3, 1, 2, 1, 2]
[3, 3, 1, 2, 2, 1]
[3, 3, 2, 1, 1, 2]
[3, 3, 2, 1, 2, 1]
[3, 3, 2, 2, 1, 1]

【讨论】:

    猜你喜欢
    • 2019-06-24
    • 2021-04-03
    • 1970-01-01
    • 1970-01-01
    • 2013-02-16
    • 2016-10-23
    • 2023-03-12
    • 2014-07-05
    • 1970-01-01
    相关资源
    最近更新 更多