我搜索了一个相关问题,但找不到。所以我的问题是如何根据任意顺序对数组进行排序。例如,假设顺序为:
order_of_elements = ['cc', 'zz', '4b', '13']
和我要排序的列表:
list_to_be_sorted = ['4b', '4b', 'zz', 'cc', '13', 'cc', 'zz']
所以结果必须是:
ordered_list = ['cc', 'cc', 'zz', 'zz', '4b', '4b', '13']
请注意,参考列表(order_of_elements)描述了排序,我不问根据参考列表的字母排序索引进行排序的问题。
您可以假设order_of_elements
数组包含所有可能的元素。
欢迎使用任何伪代码。
答案 0 :(得分:2)
完成此操作的一种简单且Pythonic的方式是为order_of_elements
数组计算索引查找表,并将索引用作排序键:
order_index_table = { item: idx for idx, item in enumerate(order_of_elements) }
ordered_list = sorted(list_to_be_sorted, key=lambda x: order_index_table[x])
该表将订单查找减少为O(1)
(分期偿还),因此不会改变排序的时间复杂度。
(当然,它会假设list_to_be_sorted
中的所有元素都存在于order_of_elements
中;如果不一定是这种情况,则需要在键lambda中使用默认的返回值。)>
答案 1 :(得分:1)
由于可能的元素数量有限,并且如果这些元素是可哈希的,则可以使用一种计数排序。
将哈希表中order_of_elements
的所有元素作为键,并将计数器作为值。遍历list_to_be_sorted
,增加与当前元素相对应的计数器。要构建ordered_list
,请遍历order_of_elements
,然后将每个当前元素添加该元素的计数器指示的次数。
hashmap hm;
for e in order_of_elements {
hm.add(e, 0);
}
for e in list_to_be_sorted {
hm[e]++;
}
list ordered_list;
for e in order_of_elements {
list.append(e, hm[e]); // Append hm[e] copies of element e
}
答案 2 :(得分:0)
方法:
对辅助数组进行排序。
2.1在排序辅助数组时重新排列主数组中的值