假设我有两个数组,第一个包含int数据,第二个包含位置
a = [11, 22, 44, 55]
b = [0, 1, 10, 11]
即。我希望将a[i]
移至b[i]
for all i
位置。如果我没有指定位置,请插入-1
即
sorted_a = [11, 22,-1,-1,-1,-1,-1,-1,-1,-1, 44, 55]
^ ^ ^ ^
0 1 10 11
另一个例子:
a = [int1, int2, int3]
b = [5, 3, 1]
sorted_a = [-1, int3, -1, int2, -1, int1]
这是我尝试过的:
def sort_array_by_second(a, b):
sorted = []
for e1 in a:
sorted.appendAt(b[e1])
return sorted
我显然搞砸了。
答案 0 :(得分:7)
这样的事情:
res = [-1]*(max(b)+1) # create a list of required size with only -1's
for i, v in zip(b, a):
res[i] = v
算法背后的想法:
b
-1
b
元素res[b[i]]
a[i]
中设置元素
醇>
这将使结果列表中的-1
位于除b
中包含的索引之外的其他位置,其中a
的对应值为{{1}}。
答案 1 :(得分:1)
我会使用自定义key
函数作为排序参数。这将根据另一个列表中的相应值对值进行排序:
to_be_sorted = ['int1', 'int2', 'int3', 'int4', 'int5']
sort_keys = [4, 5, 1, 2, 3]
sort_key_dict = dict(zip(to_be_sorted, sort_keys))
to_be_sorted.sort(key = lambda x: sort_key_dict[x])
这样做的好处是不会将sort_keys
中的值视为有效的整数索引,这不是一个非常稳定的事情。
答案 2 :(得分:1)
>>> a = ["int1", "int2", "int3", "int4", "int5"]
>>> b = [4, 5, 1, 2, 3]
>>> sorted(a, key=lambda x, it=iter(sorted(b)): b.index(next(it)))
['int4', 'int5', 'int1', 'int2', 'int3']
答案 3 :(得分:1)
Paulo Bu答案是最好的pythonic方式。如果你想坚持使用像你这样的功能:
def sort_array_by_second(a, b):
sorted = []
for n in b:
sorted.append(a[n-1])
return sorted
会做到这一点。
答案 4 :(得分:1)
按B的值排序A:
A = ['int1', 'int2', 'int3', 'int4', 'int5']
B = [4, 5, 1, 2, 3]
from operator import itemgetter
C = [a for a, b in sorted(zip(A, B), key = itemgetter(1))]
print C
<强>输出强>
['int3', 'int4', 'int5', 'int1', 'int2']
答案 5 :(得分:1)
a = [11, 22, 44, 55] # values
b = [0, 1, 10, 11] # indexes to sort by
sorted_a = [-1] * (max(b) + 1)
for index, value in zip(b, a):
sorted_a[index] = value
print(sorted_a)
# -> [11, 22, -1, -1, -1, -1, -1, -1, -1, -1, 44, 55]