若瑆 2021-05-15 17:28 采纳率: 0%
浏览 12

关于python列表嵌套字典的排序问题,如何得到以下的结果呢

a = [
    {'CtnNo': 'GVCU5272950', 'sizeType': '40', 'VesCellNo': '211888'},
    {'CtnNo': 'GVCU5272950', 'sizeType': '40', 'VesCellNo': '211688'},
    {'CtnNo': 'GVCU5272950', 'sizeType': '40', 'VesCellNo': '211882'},
    {'CtnNo': 'GATU8780448', 'sizeType': '40', 'VesCellNo': '321686'},
    {'CtnNo': 'GATU8780448', 'sizeType': '40', 'VesCellNo': '321688'},
    {'CtnNo': 'GATU8780448', 'sizeType': '40', 'VesCellNo': '321488'},
    {'CtnNo': 'GATU8780448', 'sizeType': '40', 'VesCellNo': '531686'},
    {'CtnNo': 'GATU8780448', 'sizeType': '40', 'VesCellNo': '121686'},
    {'CtnNo': 'GVCU5272950', 'sizeType': '40', 'VesCellNo': '131688'},
    {'CtnNo': 'GVCU5272950', 'sizeType': '40', 'VesCellNo': '351688'}]

# 只对如果'VesCellNo'的值的字符串前两位相同的情况下进行排序如21和32,
# #并且先按照这个字串的第三四位排序且小的排在前面例如211688应该排在21188前面因为16小于18,
# #若第三四位也相同则按照第五六位排序且大的排在前面例如321688应该排在321686前面因为88大于86
# #希望得到数组如下
b = [{'CtnNo': 'GVCU5272950', 'sizeType': '40', 'VesCellNo': '211688'},
     {'CtnNo': 'GVCU5272950', 'sizeType': '40', 'VesCellNo': '211888'},
     {'CtnNo': 'GVCU5272950', 'sizeType': '40', 'VesCellNo': '211882'},
     {'CtnNo': 'GATU8780448', 'sizeType': '40', 'VesCellNo': '321488'},
     {'CtnNo': 'GATU8780448', 'sizeType': '40', 'VesCellNo': '321688'},
     {'CtnNo': 'GATU8780448', 'sizeType': '40', 'VesCellNo': '321686'},
     {'CtnNo': 'GATU8780448', 'sizeType': '40', 'VesCellNo': '531686'},
     {'CtnNo': 'GATU8780448', 'sizeType': '40', 'VesCellNo': '121686'},
     {'CtnNo': 'GVCU5272950', 'sizeType': '40', 'VesCellNo': '131688'},
     {'CtnNo': 'GVCU5272950', 'sizeType': '40', 'VesCellNo': '351688'}]
  • 写回答

1条回答 默认 最新

  • benbenli 2021-05-15 21:45
    关注
    a = [
        {'CtnNo': 'GVCU5272950', 'sizeType': '40', 'VesCellNo': '211888'},
        {'CtnNo': 'GVCU5272950', 'sizeType': '40', 'VesCellNo': '211688'},
        {'CtnNo': 'GVCU5272950', 'sizeType': '40', 'VesCellNo': '211882'},
        {'CtnNo': 'GATU8780448', 'sizeType': '40', 'VesCellNo': '321686'},
        {'CtnNo': 'GATU8780448', 'sizeType': '40', 'VesCellNo': '321688'},
        {'CtnNo': 'GATU8780448', 'sizeType': '40', 'VesCellNo': '321488'},
        {'CtnNo': 'GATU8780448', 'sizeType': '40', 'VesCellNo': '531686'},
        {'CtnNo': 'GATU8780448', 'sizeType': '40', 'VesCellNo': '121686'},
        {'CtnNo': 'GVCU5272950', 'sizeType': '40', 'VesCellNo': '131688'},
        {'CtnNo': 'GVCU5272950', 'sizeType': '40', 'VesCellNo': '351688'}]
    
    b_21_32 = [x for x in a if x["VesCellNo"].startswith("21") or x[“VesCellNo"].startswith("32")]
    c_rest = [x for x in a if not x["VesCellNo"].startswith("21") and not x["VesCellNo"].startswith("32")]
    
    def sort_key(x):
        v = x["VesCellNo"]
        n = int(v)
        t = n % 100
        n = int(n / 100) * 100 + 99 - t
        return n
    
    b_21_32.sort(key = sort_key)
    
    d = b_21_32 + c_rest
    
    print(d)
    
    
    
    # Output:
    [{'CtnNo': 'GVCU5272950', 'sizeType': '40', 'VesCellNo': '211688'},
     {'CtnNo': 'GVCU5272950', 'sizeType': '40', 'VesCellNo': '211888'}, 
     {'CtnNo': 'GVCU5272950', 'sizeType': '40', 'VesCellNo': '211882'}, 
     {'CtnNo': 'GATU8780448', 'sizeType': '40', 'VesCellNo': '321488'}, 
     {'CtnNo': 'GATU8780448', 'sizeType': '40', 'VesCellNo': '321688'}, 
     {'CtnNo': 'GATU8780448', 'sizeType': '40', 'VesCellNo': '321686'}, 
     {'CtnNo': 'GATU8780448', 'sizeType': '40', 'VesCellNo': '531686'}, 
     {'CtnNo': 'GATU8780448', 'sizeType': '40', 'VesCellNo': '121686'}, 
     {'CtnNo': 'GVCU5272950', 'sizeType': '40', 'VesCellNo': '131688'}, 
     {'CtnNo': 'GVCU5272950', 'sizeType': '40', 'VesCellNo': '351688'}]
    评论

报告相同问题?

悬赏问题

  • ¥15 写一个方法checkPerson,入参实体类Person,出参布尔值
  • ¥15 我想咨询一下路面纹理三维点云数据处理的一些问题,上传的坐标文件里是怎么对无序点进行编号的,以及xy坐标在处理的时候是进行整体模型分片处理的吗
  • ¥15 CSAPPattacklab
  • ¥15 一直显示正在等待HID—ISP
  • ¥15 Python turtle 画图
  • ¥15 关于大棚监测的pcb板设计
  • ¥15 stm32开发clion时遇到的编译问题
  • ¥15 lna设计 源简并电感型共源放大器
  • ¥15 如何用Labview在myRIO上做LCD显示?(语言-开发语言)
  • ¥15 Vue3地图和异步函数使用