我正在尝试根据另一个数组的值排列一个数组。 A=[5,6,7,8] P=[1,3,2,0] 应该回来 [6,8,7,5]
我用python编写了以下代码。我想看看这是否是一个可以接受的解决这个问题的方法,或者是否有更好的方法来解决这个问题
def permute(A, P):
for i in range(len(P)):
if i != P[i]:
if int(P[P[i]]) >= 0:
if A[i]>0:
A[i], P[i]=A[P[i]], -A[i]
else:
A[i], P[i] = A[P[i]], f"{A[i]}"
else:
if isinstance(P[P[i]],int):
A[i], P[i] = -P[P[i]], -A[i]
else:
A[i], P[i] = int(P[P[i]]), f"{A[i]}"
return(A)
我将A中的原始值作为负值存储在p中,这样我就可以通过更改符号将其检索回来。 但是,如果原始数组中的值为负数,我将进行字符串转换,以跟踪值为负数的时间和在P中存储为负数的时间
这段代码是有效的,但正在寻找关于是否可以以更干净的方式实现这一点的想法
似乎更倾向于使用列表压缩:
此外,如果使用numpy数组istead,则只需使用
P
数组作为新列表的索引:同时给出正确的答案
如果我理解正确,这不是你想要的吗
就地复制,使用p跟踪原始值。将交换的原始值复制到P。如果P中的索引值已被迭代,则使用P,否则使用A中的值(以检查是否已被覆盖)
如果您需要就地复制值而不创建列表(在时间和空间上都稍微高效一些),那么直接将值复制到p会更简单,并将p用作新的a,但出于某种原因,您似乎希望在a上就地复制值,并且只将p用作临时存储
列表理解也更容易实现,并且在不改变列表的情况下创建副本
效率上的差异其实并不重要。即使您在资源受限的情况下处理非常大的列表,也不可能有明显的区别,更不用说成为瓶颈了
相关问题 更多 >
编程相关推荐