我需要一个python函数(一个创建函数的函数),它为长度N的列表创建所有循环置换操作符。
对于python列表a(例如a = [1, 2, 3, 4,5,6], N= 6),可以定义一个函数
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个操作符,当应用到列表时,每个操作符都会给出一个排列的列表。
发布于 2019-05-16 15:02:31
我不太确定这个练习的目的是什么,但是您可以使用部分函数来完成这个任务。
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]发布于 2019-05-16 15:02:27
您可以编写一个返回函数的函数:
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输出:
[[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()在每个实例中需要的所有参数的方法。
发布于 2019-05-16 15:20:36
你可以做下面的事。在一个cyclic_perm上调用input_list函数将返回操作符(函数)列表,当在input_list上调用这些运算符(函数)时,将给出所需的结果。
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))https://stackoverflow.com/questions/56171246
复制相似问题