如何构造个性化排列

时间:2018-07-24 12:21:56

标签: python numpy scipy itertools

我想创建一组给定列表的排列,例如.text-center { text-align: center!important; position: fixed; } .col-sm-7 {left: 25%;} .right { right: 6%; } 。我知道a = np.array([0,1,2]),但是我需要一些可以个性化的东西,以便我的排列遵循某些规则。

例如,这样的规则可能是1不能是第二个元素。使用itertools创建所有排列并测试所有排列是否符合规则,将花费太多时间。

所以我想我需要一个函数来自己创建排列,但是我不知道该怎么做。您能帮我编写一个将列表作为参数并返回该列表所有可能排列的函数吗?然后,我将能够对其进行修改,以使排列符合我的规则。

1 个答案:

答案 0 :(得分:0)

编辑:如@ Mr.T所述,itertools是C库。

这意味着先调用itertools.permutations,然后再过滤可能比在python中实现自己的“优化”功能更快。

理想情况下,您可以在C中实现“优化”功能,然后从python调用它。

为了完整起见,这是itertools的等效源代码,您可以根据需要进行修改:

def permutations(iterable, r=None):
    # permutations('ABCD', 2) --> AB AC AD BA BC BD CA CB CD DA DB DC
    # permutations(range(3)) --> 012 021 102 120 201 210
    pool = tuple(iterable)
    n = len(pool)
    r = n if r is None else r
    if r > n:
        return
    indices = list(range(n))
    cycles = list(range(n, n-r, -1))
    yield tuple(pool[i] for i in indices[:r])
    while n:
        for i in reversed(range(r)):
            cycles[i] -= 1
            if cycles[i] == 0:
                indices[i:] = indices[i+1:] + indices[i:i+1]
                cycles[i] = n - i
            else:
                j = cycles[i]
                indices[i], indices[-j] = indices[-j], indices[i]
                yield tuple(pool[i] for i in indices[:r])
                break
        else:
            return

详细信息: https://docs.python.org/3/library/itertools.html#itertools.permutations

如果您想实现C代码并在python中使用它:

  

我们使用诸如C,C ++或   Java可以集成或导入Python。该代码是   被认为是“扩展”。Python扩展模块什么都不是   不仅仅是普通的C库。在Unix机器上,这些库   通常以.so结尾(对于共享对象)。在Windows计算机上,您   通常参见.dll(用于动态链接库)。

     

详细信息:https://medium.com/practo-engineering/execute-python-code-at-the-speed-of-c-extending-python-93e081b53f04