【问题标题】:Sorting nested list of list using sorted function.?使用排序函数对列表的嵌套列表进行排序。?
【发布时间】:2017-05-27 14:12:30
【问题描述】:

我有一个名为 myList 的列表。我想要实现的是,我想根据年龄键的值对列表列表进行排序。我知道它可以用排序函数来完成,但我不知道如何为键编写函数。任何人都可以建议我解决我的问题。

myList = [ {'john':{'age':30 ,'salary':600000}}, {'mullar':{'age':25 ,'salary':250000}},
           {'todd':{'age':40 ,'salary':300000}},{'rolex':{'age':20 ,'salary':450000}},
           {'ron':{'age':20 ,'salary':500000}},{'gilex':{'age':30 ,'salary':450000}},
           {'larrat':{'age':41 ,'salary':350000}},{'fyoid':{'age':24 ,'salary':400000}},
           {'devon':{'age':33 ,'salary':600000}},{'dron':{'age':20 ,'salary':200000}}
         ]

【问题讨论】:

    标签: python list python-3.x sorting dictionary


    【解决方案1】:
    def getAge(d):
      salary = list(d.values())[0]['age']
      return salary
    
    
    
    #d.values() => dict_values([{'age': 30, 'salary': 600000}])
    #list(d.values()) => [{'age': 30, 'salary': 600000}]
    #list(d.values())[0] => {'age': 30, 'salary': 600000}
    ##list(d.values())[0]['age'] => 30
    print(sorted(myList,key=getAge))
    

    结果

    [{'rolex': {'age': 20, 'salary': 450000}}, {'ron': {'age': 20, 'salary': 500000}}, {'dron': {'age': 20, 'salary': 200000}}, {'fyoid': {'age': 24, 'salary': 400000}}, {'mullar': {'age': 25, 'salary': 250000}},{'约翰':{'年龄':30,'薪水':600000}},{'gilex':{'年龄': 30,“工资”:450000}},{“德文”:{“年龄”:33,“工资”:600000}}, {'todd': {'age': 40, 'salary': 300000}}, {'larrat': {'age': 41, “工资”:350000}}]

    【讨论】:

      【解决方案2】:

      问题是您的列表包含一个包含字典的字典。您需要以某种方式获取内部字典。这通常通过获取next 项目来解决:next(iter(subdict.values()))。此后获取'age' 值并不复杂,只需使用'age' 进行索引即可:

      >>> sorted(myList, key=lambda x: next(iter(x.values()))['age'])
      [{'rolex': {'age': 20, 'salary': 450000}},
       {'ron': {'age': 20, 'salary': 500000}},
       {'dron': {'age': 20, 'salary': 200000}},
       {'fyoid': {'age': 24, 'salary': 400000}},
       {'mullar': {'age': 25, 'salary': 250000}},
       {'john': {'age': 30, 'salary': 600000}},
       {'gilex': {'age': 30, 'salary': 450000}},
       {'devon': {'age': 33, 'salary': 600000}},
       {'todd': {'age': 40, 'salary': 300000}},
       {'larrat': {'age': 41, 'salary': 350000}}]
      

      除了lambda,您还可以define 函数:

      def age(somedict):
          inner_dict, = somedict.values()  # or inner_dict = next(iter(somedict.values()))
          return inner_dict['age']
      

      同样有效:

      >>> sorted(myList, key=age)
      [... same as above ...]
      

      但是我个人会先将字典展平(作为单个字典或collections.namedtuples,或者如果您可以访问pandas,则作为DataFrames):

      myList2 = [{'name': key, 'age': value['age'], 'salary': value['salary']}
                 for dct in myList
                 for key, value in dct.items()]
      print(myList2)
      #[{'age': 30, 'name': 'john', 'salary': 600000},
      # {'age': 25, 'name': 'mullar', 'salary': 250000},
      # {'age': 40, 'name': 'todd', 'salary': 300000},
      # {'age': 20, 'name': 'rolex', 'salary': 450000},
      # {'age': 20, 'name': 'ron', 'salary': 500000},
      # {'age': 30, 'name': 'gilex', 'salary': 450000},
      # {'age': 41, 'name': 'larrat', 'salary': 350000},
      # {'age': 24, 'name': 'fyoid', 'salary': 400000},
      # {'age': 33, 'name': 'devon', 'salary': 600000},
      # {'age': 20, 'name': 'dron', 'salary': 200000}]
      

      这简化了key-函数:

      sorted(myList2, key=lambda x: x['age'])  # or operator.itemgetter('age')
      [{'age': 20, 'name': 'rolex', 'salary': 450000},
       {'age': 20, 'name': 'ron', 'salary': 500000},
       {'age': 20, 'name': 'dron', 'salary': 200000},
       {'age': 24, 'name': 'fyoid', 'salary': 400000},
       {'age': 25, 'name': 'mullar', 'salary': 250000},
       {'age': 30, 'name': 'john', 'salary': 600000},
       {'age': 30, 'name': 'gilex', 'salary': 450000},
       {'age': 33, 'name': 'devon', 'salary': 600000},
       {'age': 40, 'name': 'todd', 'salary': 300000},
       {'age': 41, 'name': 'larrat', 'salary': 350000}]
      

      DataFrames 更容易:

      >>> import pandas as pd
      >>> df = pd.DataFrame(myList2)
      >>> df.sort_values('age')
         age    name  salary
      3   20   rolex  450000
      4   20     ron  500000
      9   20    dron  200000
      7   24   fyoid  400000
      1   25  mullar  250000
      0   30    john  600000
      5   30   gilex  450000
      8   33   devon  600000
      2   40    todd  300000
      6   41  larrat  350000
      

      【讨论】:

      • 你也可以使用解包来获取记录:inner_dict, = somedict.values(); return inner_dict['age'] 但你必须确信只有一个值。
      猜你喜欢
      • 1970-01-01
      • 2013-02-06
      • 1970-01-01
      • 2010-09-21
      • 1970-01-01
      • 2022-01-14
      • 1970-01-01
      相关资源
      最近更新 更多