Python排序数组由另一个位置数组组成

时间:2013-12-11 23:10:10

标签: python arrays sorting

假设我有两个数组,第一个包含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

我显然搞砸了。

6 个答案:

答案 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 

算法背后的想法:

  1. 创建结果列表,其大小能够容纳b
  2. 中最大的索引
  3. 使用-1
  4. 填充此列表
  5. 遍历b元素
  6. 使用适当的值res[b[i]]
  7. 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]