关于#python#的问题:使用三目运算符和lambda来进行排序

请教各位一个问题,

dic={'url': 'https://starwars.fandom.com/wiki/Ahch-To', 'name': 'Ahch-To', 'region': 'Unknown Regions', 'sector': None, 'suns': 2, 'moons': 1, 'orbital_period_days': None, 'diameter_km': None, 'gravity_std': None, 'climate': None, 'terrain': ['Oceans', 'Rocky islands'], 'population': 1}

plants是由dic类型所构成的列表,题目要求使用三目运算符和lambda来进行排序,
如果diameter_km不为空,就按照diameter_km降序排列,
如果diameter_km为空,就按照name升序排列。
plants里面diameter_km有为空的也有不为空的,这样该如何写这个代码呢
我是这样写的,但是好像不行

a= sorted(planets, key=lambda x:(x['name']if x['diameter_km'] is None else x['diameter_km']))

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 以下回答来自chatgpt:

    要实现按照diameter_km字段的值进行降序排序,如果diameter_km字段值为空,则按照name字段进行升序排序,可以使用lambda表达式进行排序,并在其中使用三目运算符实现条件判断。具体实现如下:

    # 假设plants是要排序的列表
    # 使用lambda表达式定义排序规则
    plants.sort(key=lambda x: (-x['diameter_km'] if x['diameter_km'] else float('inf'), x['name']))
    
    # 排序后的结果将会按照diameter_km字段的值进行降序排序,
    # 如果diameter_km字段值为空,则按照name字段进行升序排序。
    

    需要注意的是,我们在lambda表达式中使用了三目运算符,如果diameter_km字段的值为空,则将其设置为一个很大的数,以保证其在排序时排在最后面。同时,在排序时用负值进行降序排序。

    另外,需要注意的是如果数据量较大,排序过程可能会比较耗时。在实际应用中,可以考虑使用其他排序算法或者在数据量较大时使用数据库进行排序等方法来提高效率。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^

先把你的lambda写成一个函数
再把你的三目写成if else
这样才好调试,看看x传入的究竟对不对


    planets_diameter_km = sorted(list(filter(lambda temp:temp.get('diameter_km')!=None,planets)), key=lambda x: (x['diameter_km']),reverse=True)+sorted(list(filter(lambda temp:temp.get('diameter_km')==None,planets)), key=lambda x:(x['name']))

写出来了,太麻烦了