我正在尝试遍历n个整数的不同排列,并根据以下规则为每个整数生成一个新的整数:
例如查看(1,2,3)的排列:(2,3,1)将生成(3,1,2),因为第一个元组中的索引2为1,所以2替换了1,索引3为2所以3替换2,索引1是3所以1替换3
我想知道最有效的方法是什么?
我已经使用itertools中的置换功能启动了该功能:
# Define a function with the input of a list of the permutations/n-tuples L e.g. [1,2,3]
from itertools import *
def GeneratePerm(L):
perm=list(permutations(L))
for p in perm:
for element in p:
index=p.index(element)
index=index+1
if element==index:
new_tup=p.index(element)
print('new_tup:',new_tup)
我真的不确定从这里要去哪里,所以任何答复将不胜感激!谢谢!
答案 0 :(得分:1)
由于Python在元组索引中从零开始,因此考虑到(0, 1, 2)
的排列(而不是(1, 2, 3)
的排列)会更简单。对于这个问题,使用列表而不是元组也将更加简单。但是这里有一些代码可以为给定的基于一的排列找到基于一的“逆排列”。
p_example = (2, 3, 1) # to (3, 1, 2)
def inv_1_based_permutation(p):
result = [0] * len(p)
for ndx, val in enumerate(p):
result[val - 1] = ndx + 1
return tuple(result)
print(inv_1_based_permutation(p_example))
请注意,- 1
和+ 1
是由于排列是基于一个的,并且例程中的最后一行从列表转换为元组。中间列表是必需的,因为该算法通过以与结果中使用的顺序不同的顺序修改顺序来工作(该顺序基于输入参数)。该例程的时间复杂度为O(n)
,其中n
是排列的长度。您的代码为O(n^2)
,因为index()
是O(n)
,您需要为置换的每个成员调用一次。