【问题标题】:Permutation with Limiting有限制的排列
【发布时间】:2021-11-22 16:25:49
【问题描述】:

我想置换每个元素的集合.. 但是,对于集合中的每个元素。我想限制它的重复次数。

这里有一段代码可以理解:

_list_ = [0,1,3]

limit_dict = {
    
    0 : [0, 1],
    1 : [0, 3],
    3 : [0, 1]

}

def main(position=0, length=5, genlist=[]):

    if position == length:
        print (genlist)

    else:

        for element in _list_:

            if limit_dict[element][0] != limit_dict[element][1]:

                limit_dict[element][0] += 1

                main(position + 1, length, genlist + [element])

                limit_dict[element][0] -= 1

main()

这是大体思路,有没有更快的实现方式?

我想为大量整数做这样的事情,因此无法使用 itertools 来实现这一点,因为它使用了大量内存。

【问题讨论】:

  • itertools 不使用大量内存。如果您将迭代器转换为列表,那么它当然会使用内存,您想出的任何解决方案都将如此。
  • 不,这个解决方案没有,itertools 一次将所有组合放入一个列表中,而这个解决方案只适用于一个列表并每次都打印出来
  • itertools 不会将所有组合放入一个列表中。它产生一个迭代器。由您决定是逐个使用它们还是将它们转换为列表。
  • OOwwh,等等,我刚刚尝试了 itertools,我一直将它们放入列表中????

标签: python permutation large-data


【解决方案1】:

distinct_permutations from more-itertools 就是这样做的。

from more_itertools import distinct_permutations

limit_dict = {
    0 : [0, 1],
    1 : [0, 3],
    3 : [0, 1]
}

elements = (k for k, v in limit_dict.items() for _ in range(*v))
for permutation in distinct_permutations(elements):
    print(permutation)

输出:

(0, 1, 1, 1, 3)
(0, 1, 1, 3, 1)
(0, 1, 3, 1, 1)
(0, 3, 1, 1, 1)
(1, 0, 1, 1, 3)
(1, 0, 1, 3, 1)
(1, 0, 3, 1, 1)
(1, 1, 0, 1, 3)
(1, 1, 0, 3, 1)
(1, 1, 1, 0, 3)
(1, 1, 1, 3, 0)
(1, 1, 3, 0, 1)
(1, 1, 3, 1, 0)
(1, 3, 0, 1, 1)
(1, 3, 1, 0, 1)
(1, 3, 1, 1, 0)
(3, 0, 1, 1, 1)
(3, 1, 0, 1, 1)
(3, 1, 1, 0, 1)
(3, 1, 1, 1, 0)

【讨论】:

  • 我非常感谢您的解决方案,但有没有更快的方法可以在不使用 itertools 的情况下完成此操作。
  • 为什么?你对 itertools 有什么看法?
  • Nvm,我刚刚得到了问题的解决方案,谢谢大佬
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-13
  • 2018-04-21
相关资源
最近更新 更多