我想找到具有绑定值的向量的有效排列。
例如,如果perm_vector = [0,0,1,2]
我希望获得[0,0,1,2], [0,0,2,1], [0,1,2,0]
等所有组合作为输出,但我不想获得[0,0,1,2]
两次,这是标准{ {1}}会给。
我尝试了以下操作,但在len:{/ p>中itertools.permutations(perm_vector)
时,它确实很慢
perm_vector grows
实际上,问题是更加普遍的“加速”性质。主要时间用于创建长向量的排列 - 即使没有两面性,创建12个唯一值的向量的排列也需要“无穷大”。是否有可能迭代地调用itertools而不访问整个排列数据但是处理它的串?
答案 0 :(得分:1)
如果perm_vector很小,请尝试此操作:
import itertools as iter
{x for x in iter.permutations(perm_vector)}
这应该为您提供唯一值,因为它现在变为一个集合,默认情况下删除重复。
如果perm_vector很大,您可能想尝试回溯:
def permu(L, left, right, cache):
for i in range(left, right):
L[left], L[i] = L[i], L[left]
L_tuple = tuple(L)
if L_tuple not in cache:
permu(L, left + 1, right, cache)
L[left], L[i] = L[i], L[left]
cache[L_tuple] = 0
cache = {}
permu(perm_vector, 0, len(perm_vector), cache)
cache.keys()
答案 1 :(得分:0)
这个怎么样:
from collections import Counter
def starter(l):
cnt = Counter(l)
res = [None] * len(l)
return worker(cnt, res, len(l) - 1)
def worker(cnt, res, n):
if n < 0:
yield tuple(res)
else:
for k in cnt.keys():
if cnt[k] != 0:
cnt[k] = cnt[k] - 1
res[n] = k
for r in worker(cnt, res, n - 1):
yield r
cnt[k] = cnt[k] + 1