通过ru生成新元组

2024-04-25 19:51:05 发布

您现在位置:Python中文网/ 问答频道 /正文

我尝试遍历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)

我真的不知道从这里去哪里,所以任何回应将不胜感激!谢谢您!你知道吗


Tags: ofthe函数innewforindex规则
1条回答
网友
1楼 · 发布于 2024-04-25 19:51:05

由于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),您为置换的每个成员调用一次。你知道吗

相关问题 更多 >