通过规则生成新的元组

时间:2019-06-06 14:16:14

标签: python python-3.x tuples

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

我真的不确定从这里要去哪里,所以任何答复将不胜感激!谢谢!

1 个答案:

答案 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),您需要为置换的每个成员调用一次。