在python中排列数组

2024-04-29 18:51:57 发布

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

我正在尝试根据另一个数组的值排列一个数组。 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中存储为负数的时间

这段代码是有效的,但正在寻找关于是否可以以更干净的方式实现这一点的想法


Tags: 方法代码inforlenifdef时间
3条回答

似乎更倾向于使用列表压缩:

A = [5, 6, 7, 8]
P = [1, 3 ,2, 0]

print([A[i] for i in P ])

此外,如果使用numpy数组istead,则只需使用P数组作为新列表的索引:

import numpy as np

A = np.array([5, 6, 7, 8])
P = [1, 3 ,2, 0]

print(A[P])

同时给出正确的答案

如果我理解正确,这不是你想要的吗

A = [5, 6, 7, 8]
P = [1, 3 ,2, 0]

for i in range(len(P)):
    print(A[P[i]])

就地复制,使用p跟踪原始值。将交换的原始值复制到P。如果P中的索引值已被迭代,则使用P,否则使用A中的值(以检查是否已被覆盖)

A = [5, 6, 7, 8]
P = [1, 3 ,2, 0]
for i,p in enumerate(P):
  P[i]=A[i]
  A[i]=P[p] if p < i else A[p]

如果您需要就地复制值而不创建列表(在时间和空间上都稍微高效一些),那么直接将值复制到p会更简单,并将p用作新的a,但出于某种原因,您似乎希望在a上就地复制值,并且只将p用作临时存储

列表理解也更容易实现,并且在不改变列表的情况下创建副本

效率上的差异其实并不重要。即使您在资源受限的情况下处理非常大的列表,也不可能有明显的区别,更不用说成为瓶颈了

相关问题 更多 >