python - 通过规则生成新元组
问题描述
我试图通过 n 个整数的不同排列,并根据以下规则为每个整数生成一个新的排列:
例如,查看 (1,2,3) 的排列: (2,3,1) 将生成 (3,1,2),因为第一个元组中 2 的索引是 1 所以 2 替换 1,索引 3 是2 所以 3 替换 2,1 的索引是 3 所以 1 替换 3
我想知道最有效的方法是什么?
我已经使用 itertools 中的 permutations 函数启动了该函数:
# 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)
我真的不确定从这里去哪里,所以任何回复都将不胜感激!谢谢!
解决方案
由于 Python 的元组索引是从零开始的,因此考虑 的排列((0, 1, 2)
这很常见)而不是 的排列会更简单(1, 2, 3)
。对于这个问题,使用列表而不是元组也会更简单。但是这里有一些代码可以为给定的基于 1 的排列找到基于 1 的“逆排列”。
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
and+ 1
是由于排列是从一开始的,并且例程中的最后一行从列表转换为元组。中间列表是必要的,因为该算法通过以与结果中使用的顺序不同的顺序修改序列来工作(顺序基于输入参数)。该例程的时间复杂度是O(n)
排列n
的长度。您的代码是O(n^2)
since index()
is O(n)
,并且您为排列的每个成员调用一次。
推荐阅读
- javascript - 将文件作为 $http.post 响应返回
- javascript - 通过ajax发布巨大的字符串到spring控制器
- python - Azure Batch 数据科学 VM python 包丢失
- android-fragments - Activity 独立加载,但不在 Fragment 中
- jquery - jQuery自动完成特定的keyup问题
- javascript - 如何在 jquery 转发器中为输入的日期类型设置默认值?
- python - 按过去 7 周的日期选择数据集记录
- asp.net - 在类库项目中访问 appsettings.json(在 WepApi-project 中)
- ansible - 如何根据条件打破 with_items 循环
- python-3.x - 不和谐机器人的语法无效(python)