如何更改数组中元素的索引

时间:2018-12-30 21:45:53

标签: python python-3.x sorting indexing

我有一个数组:

ind = [6, 4, 3, 9, 10, 8, 1, 5, 2, 7, 0]

我想基于此更改 b 中元素的索引:

modified_b = [11,7,9,3,2,8,1,10,6,4,5]

正确修改后的 b 为:

b = [1,2,3,4,5,6,7,8,9,10,11]

ind = [6, 4, 3, 9, 10, 8, 1, 5, 2, 7, 0]

b_modified = []

for j in range(0,len(b)):
   b_modified.insert(ind[j],b[j])
print (b_modified)

这是我尝试过的:

[11, 1, 7, 9, 2, 3, 4, 8, 10, 5, 6]

结果不正确:

String value  = "Red";
Integer num = value
        .codePoints()
        .sum();
        System.out.println(num); //283

有任何想法如何在python中执行此操作吗?

4 个答案:

答案 0 :(得分:2)

您可以基于索引的压缩对象和值来创建新列表:

>>> [t[1] for t in sorted(zip(ind,b))]
[11, 7, 9, 3, 2, 8, 1, 10, 6, 4, 5]

或执行切片分配以修改b就位:

>>> b[:]=[t[1] for t in sorted(zip(ind,b))]
>>> b
[11, 7, 9, 3, 2, 8, 1, 10, 6, 4, 5]

这将在中小型列表O(n log n)上具有合理的性能。如果需要考虑速度,则可以使用enumerate直接替换相应的元素以获取O(n)

mod_b=[None]*len(b)
for i,x in enumerate(ind):
    mod_b[x]=b[i]

>>> mod_b
[11, 7, 9, 3, 2, 8, 1, 10, 6, 4, 5]

答案 1 :(得分:1)

创建一个新的空数组并分配索引:

b = [1,2,3,4,5,6,7,8,9,10,11]
ind = [6, 4, 3, 9, 10, 8, 1, 5, 2, 7, 0]

b_modified = [0] * len(b)

for i in range(len(ind)):
    b_modified[ind[i]] = b[i]

print(b_modified)

>>> [11,7,9,3,2,8,1,10,6,4,5]

答案 2 :(得分:1)

您可以使用sort类型的内置list函数来做到这一点:

sorted(b, key=lambda x: ind[x-1])

将返回根据需要排序的新列表。

如果要就地进行排序:

b.sort(key=lambda x: ind[x-1])

答案 3 :(得分:1)

通常情况下,排序需要O( n log n )时间,而O( n )时间就足够了。对于O( n )解决方案,可以将'Cache-Control': 'no-cache'循环与for一起使用:

zip

b = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11] ind = [6, 4, 3, 9, 10, 8, 1, 5, 2, 7, 0] res = [0] * len(b) for val, idx in zip(b, ind): res[idx] = val # [11, 7, 9, 3, 2, 8, 1, 10, 6, 4, 5] 在这里不合适,因为您无法访问列表中不存在的索引。由于您事先知道结果的大小,因此可以实例化具有此大小的列表。

您还可以使用支持向量化索引的第三方NumPy

list.insert