首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >python中的循环置换算子

python中的循环置换算子
EN

Stack Overflow用户
提问于 2019-05-16 14:46:49
回答 5查看 5.9K关注 0票数 5

我需要一个python函数(一个创建函数的函数),它为长度N的列表创建所有循环置换操作符。

对于python列表a(例如a = [1, 2, 3, 4,5,6], N= 6),可以定义一个函数

代码语言:javascript
复制
def cyclic_perm(a):
    n = len(a)
    b = [[a[i - j] for i in range(n)] for j in range(n)]
    return b

这为您提供了列表的所有可能的循环排列,在本例中为6个列表。

我希望函数给我的不是列表,而是(在本例中)6个操作符,当应用到列表时,每个操作符都会给出一个排列的列表。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2019-05-16 15:02:31

我不太确定这个练习的目的是什么,但是您可以使用部分函数来完成这个任务。

代码语言:javascript
复制
from functools import partial

def reorder_from_idx(idx, a):
    return a[idx:] + a[:idx]

def cyclic_perm(a):
    return [partial(reorder_from_idx, i) for i in range(len(a))]


a = [1, 2, 3, 4, 5, 6]
result = cyclic_perm(a)
print(result)
#[functools.partial(<function reorder_from_idx at 0x00000298D92189D8>, 0),
# functools.partial(<function reorder_from_idx at 0x00000298D92189D8>, 1),
# functools.partial(<function reorder_from_idx at 0x00000298D92189D8>, 2),
# functools.partial(<function reorder_from_idx at 0x00000298D92189D8>, 3),
# functools.partial(<function reorder_from_idx at 0x00000298D92189D8>, 4),
# functools.partial(<function reorder_from_idx at 0x00000298D92189D8>, 5)]
result[3](a)
#[4, 5, 6, 1, 2, 3]
票数 5
EN

Stack Overflow用户

发布于 2019-05-16 15:02:27

您可以编写一个返回函数的函数:

代码语言:javascript
复制
def cyclic_perm(a):
    n = len(a)
    b = [[a[i - j] for i in range(n)] for j in range(n)]
    return b

def cyclic_perm_func(a):
    n = len(a)
    def wrapper(a, n, j):
        def cyc():
            return [a[i - j] for i in range(n)]
        return cyc
    b = [wrapper(a, n, j) for j in range(n)]
    return b

a = [1, 2, 3, 4,5,6]
print(cyclic_perm(a))  # Your original function
f = cyclic_perm_func(a) # f is now a list of functions
print([g() for g in f])  # Let's call each in turn

输出:

代码语言:javascript
复制
[[1, 2, 3, 4, 5, 6], [6, 1, 2, 3, 4, 5], [5, 6, 1, 2, 3, 4], [4, 5, 6, 1, 2, 3], [3, 4, 5, 6, 1, 2], [2, 3, 4, 5, 6, 1]]
[[1, 2, 3, 4, 5, 6], [6, 1, 2, 3, 4, 5], [5, 6, 1, 2, 3, 4], [4, 5, 6, 1, 2, 3], [3, 4, 5, 6, 1, 2], [2, 3, 4, 5, 6, 1]]

注意,wrapper()是捕获包装函数cyc()在每个实例中需要的所有参数的方法。

票数 4
EN

Stack Overflow用户

发布于 2019-05-16 15:20:36

你可以做下面的事。在一个cyclic_perm上调用input_list函数将返回操作符(函数)列表,当在input_list上调用这些运算符(函数)时,将给出所需的结果。

代码语言:javascript
复制
input_list = [1, 2, 3, 4, 5, 6]


def cyclic_perm(a):
    n = len(a)
    result = []
    for j in range(n):
        def f(l, k=j):
            return list(map(lambda i: l[i - k], range(n)))
        result.append(f)
    return result


for op in cyclic_perm(input_list):
    print(op(input_list))
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56171246

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档