按双列对Item序列排序的技术问询及结果验证
分析双列排序规则及验证疑似排序结果
首先,我们把原始数据和疑似正确的排序列表整理成清晰的表格,方便对比分析:
原始列表
| Item# | To | From |
|---|---|---|
| A100 | 000000 | 803441 |
| A200 | 803441 | 000000 |
| A300 | 000000 | 542032 |
| A400 | 181061 | 000000 |
| A500 | 000000 | 181061 |
| A600 | 542032 | 000000 |
疑似正确的排序列表
| Item# | To | From |
|---|---|---|
| A100 | 000000 | 803441 |
| A200 | 803441 | 000000 |
| A500 | 000000 | 181061 |
| A400 | 181061 | 000000 |
| A300 | 000000 | 542032 |
| A600 | 542032 | 000000 |
排序规则拆解
通过对比两组数据,我们可以明确这套排序是基于“配对分组+组内顺序+组间排序”的复合规则,具体如下:
第一步:配对分组
所有记录可以被分成3个独立的配对组,每组由两条记录组成:一条是To=000000且From=XXX的“出发记录”,另一条是To=XXX且From=000000的“返回记录”(XXX为非0的相同编号):- 组1:A100(出发)、A200(返回)—— 共享编号803441
- 组2:A500(出发)、A400(返回)—— 共享编号181061
- 组3:A300(出发)、A600(返回)—— 共享编号542032
第二步:组内顺序
每个组内固定是**“出发记录”在前,“返回记录”在后**,也就是To=000000的记录排在对应From=000000的记录前面。第三步:组间排序
组与组之间的排序依据是每组“返回记录”的Item#升序:- 组1的返回记录Item#是A200(数字部分200)
- 组2的返回记录Item#是A400(数字部分400)
- 组3的返回记录Item#是A600(数字部分600)
按照200 < 400 < 600的升序,组的顺序就是组1 → 组2 → 组3,这和疑似正确列表的顺序完全匹配。
对疑似排序结果的验证
从上述规则来看,你提供的疑似正确排序列表完全符合这套复合排序规则,是正确的排序结果。
如果要用代码实现这个排序逻辑(以Python为例),可以参考以下思路:
# 原始数据 data = [ {"Item#": "A100", "To": "000000", "From": "803441"}, {"Item#": "A200", "To": "803441", "From": "000000"}, {"Item#": "A300", "To": "000000", "From": "542032"}, {"Item#": "A400", "To": "181061", "From": "000000"}, {"Item#": "A500", "To": "000000", "From": "181061"}, {"Item#": "A600", "To": "542032", "From": "000000"}, ] # 先构建配对映射:非0编号对应的返回记录Item# pair_map = {} for item in data: if item["From"] == "000000": # 返回记录,记录其To编号和Item# pair_map[item["To"]] = item["Item#"] # 排序逻辑:先按配对的返回记录Item#升序,再按是否是出发记录排序(出发在前) sorted_data = sorted( data, key=lambda x: ( pair_map.get(x["From"] if x["To"] == "000000" else x["To"], ""), 0 if x["To"] == "000000" else 1 ) ) # 输出结果 for item in sorted_data: print(f"{item['Item#']} | {item['To']} | {item['From']}")
内容的提问来源于stack exchange,提问作者David Chen
相关产品推荐
相关产品推荐

