我有一个数组:
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中执行此操作吗?
答案 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