如何在Python中按子字典列表的指定值排序字典列表?
按指定列(Age/Salary)排序字典列表
要解决这个问题,我们可以利用Python内置的sorted()函数(或列表的sort()方法),通过自定义排序键提取columns子列表中对应的Age或Salary值,实现精准排序。
方法1:用lambda表达式快速提取值
每个员工的columns列表里包含两个子字典,分别对应Age和Salary,我们可以通过生成器表达式快速定位目标列的值,并转换为整数(避免字符串排序的潜在问题):
按Age升序排序
x = [ {'id': '1', 'employe_id': 15, 'name': 'John', 'columns': [{'Age': '22', 'class': 'int'}, {'Salary': '2700', 'class': 'int'}]}, {'id': '2', 'employe_id': 11, 'name': 'Sara', 'columns': [{'Age': '19', 'class': 'int'}, {'Salary': '1800', 'class': 'int'}]}, {'id': '3', 'employe_id': 12, 'name': 'Anna', 'columns': [{'Age': '34', 'class': 'int'}, {'Salary': '3500', 'class': 'int'}]}, ] # 按Age升序排序,返回新列表 sorted_by_age = sorted(x, key=lambda emp: int(next(col['Age'] for col in emp['columns'] if 'Age' in col))) print(sorted_by_age)
按Salary升序排序
只需要把'Age'替换为'Salary'即可:
# 按Salary升序排序 sorted_by_salary = sorted(x, key=lambda emp: int(next(col['Salary'] for col in emp['columns'] if 'Salary' in col))) print(sorted_by_salary)
方法2:自定义函数提升可读性
如果觉得lambda表达式不够直观,可以写一个辅助函数来提取列值,代码更易维护:
def get_column_value(employee, column_name): # 遍历员工的columns列表,找到目标列的值并转为整数 for col_dict in employee['columns']: if column_name in col_dict: return int(col_dict[column_name]) # 找不到目标列时返回默认值(可根据需求调整) return 0 # 原地修改原列表,按Age排序 x.sort(key=lambda emp: get_column_value(emp, 'Age')) print(x)
这里用了列表的sort()方法,会直接修改原列表;而sorted()会返回新列表,可根据需求选择。
运行结果验证
按Age排序后,输出结果和你预期的一致:
[ {'id': '2', 'employe_id': 11, 'name': 'Sara', 'columns': [{'Age': '19', 'class': 'int'}, {'Salary': '1800', 'class': 'int'}]}, {'id': '1', 'employe_id': 15, 'name': 'John', 'columns': [{'Age': '22', 'class': 'int'}, {'Salary': '2700', 'class': 'int'}]}, {'id': '3', 'employe_id': 12, 'name': 'Anna', 'columns': [{'Age': '34', 'class': 'int'}, {'Salary': '3500', 'class': 'int'}]} ]
关键注意点
- 必须将字符串类型的年龄/薪资转为整数:如果直接用字符串排序,遇到
'100'和'22'时,字符串排序会认为'100' < '22'(因为第一个字符'1' < '2'),不符合数值排序的预期。 - 如需降序排序,只需给
sorted()或sort()加上reverse=True参数,比如sorted(x, key=..., reverse=True)。
内容的提问来源于stack exchange,提问作者er_10
相关产品推荐
相关产品推荐

