algorithm - 如何根据任意顺序对列表进行排序
问题描述
我搜索了一个相关问题,但找不到。所以我的问题是如何根据任意顺序对数组进行排序。例如,假设排序是:
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
数组包含所有可能的元素。
欢迎任何伪代码。
解决方案
完成此操作的一种简单且 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 中的默认返回值。)
推荐阅读
- gitlab - Gitlab markdown:带有语言说明符的代码中的斜体
- docker - 无法在 Windows 上的 Ubuntu 上的 Bash 中从 docker 容器运行 apt-get update
- java - 用于对象构造的异常语法
- objective-c - 如何知道Objective C指针是否属于`Class`类型?
- swift - 基于文档的应用程序,如何从菜单中访问文档?
- android - Jetpack Compose 在方向更改时保存状态
- r - 如何使用带有纬度和经度的欧几里得 TSP 和 R 中的 TSP 库计算(估计)英里/公里?
- javascript - 使用javascript将二进制文件(Dicom文件)上传到flask服务器并同时接收JSON响应
- c++ - C++ constexpr 动态指针
- docker - 安装 Docker 时出错:请启用虚拟机平台 Windows 功能并确保在 BIOS 中启用虚拟化