具有绑定(bind)值的 python itertools 排列

标签 python performance pandas python-itertools

我想有效地找到具有绑定(bind)值的向量的排列。

例如,如果 perm_vector = [0,0,1,2] 我想获得 [0,0,1,2]、[0, 0,2,1], [0,1,2,0] 等等,但我不想两次获得 [0,0,1,2]是标准的 itertools.permutations(perm_vector) 会给出的。

我尝试了以下方法,但当 perm_vector 在 len 中增长 时它工作得非常慢:

vectors_list = []
for it in itertools.permutations(perm_vector):
    vectors_list.append(list(it))
df_vectors_list  = pd.DataFrame( vectors_list)
df_gb = df_vectors_list.groupby(list(df_vectors_list.columns)) 
vectors_list = pd.DataFrame(df_gb.groups.keys()).T

实际上,这个问题具有更普遍的“加速”性质。主要时间花在创建长向量的排列上——即使没有口是心非,创建 12 个唯一值的向量排列也需要“无穷大”。是否可以迭代调用 itertools 而无需访问整个排列数据,而是处理其中的一串数据?

最佳答案

如果 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()

关于具有绑定(bind)值的 python itertools 排列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34723932/

相关文章:

Java Canvas 绘制时间不规律?

php - array_column 和 foreach,性能方面哪个更好?

python - 将 Pandas 数据框列传递给 NLTK 分词器

excel - Pandas 0.22.0 : IndexError: list index out of range when reading xls

python - 如何在 Numpy(或其他 Python 解决方案)中利用外积的对称性?

python:打印非继承方法

python - Mypy 提示 __setitem__ 签名

java - Arrays.stream(array_name).sum() 比迭代方法慢吗?

python - 将 pandas.DataFrame 列的字符串值拆分为数组

python - 基于特定模式和编辑字符串的拆分