zoukankan      html  css  js  c++  java
  • python里的排序

    本篇文章主要讲:

    1. 自定义规则排序
    2. 多字段排序

    开讲之前,先讲一些简单sorted()或者sort(),两者返回值不同!大家自行学习,不是本文的重点!

    sorted([5, 2, 3, 1, 4]) # 输出:[1, 2, 3, 4, 5]
    

    另一个呢

    a = [5, 2, 3, 1, 4]
    a.sort()
    a
    # 输出:[1, 2, 3, 4, 5]
    

    Key 的使用

    比如,如何把数组按照长度大小进行排序,只需设置key等于一个函数即可

    sorted(["adf", "Adfdg", "aDfgbdfafg", "Gahgfh"], key = len) #输出 ['adf', 'adfdg', 'gahgfh', 'adfgbdfafg']
    

    按照小写字母排序

    sorted(["adf", "Adfdg", "aDfgbdfafg", "Gahgfh"], key = str.lower) #输出 ['adf', 'Adfdg', 'aDfgbdfafg', 'Gahgfh']
    

    上面都是自带函数,下面就开始学习。

    自定义规则排序

    直接上题目,给定一组非负整数,重新排列它们的顺序使之组成一个最大的整数。

    输入: [3,30,34,5,9]
    输出: 9534330
    

    这道题就是自定义排序,它有自己的排序规则,规则是 x + y > y + x,让x排在y前面

    这里x,y表示任意两个数的字符串。

    这里我提供两种办法

    第一种,使用 cmp_to_key,因为Python3取消了cmp

    def largestNumber(nums):
            from functools import cmp_to_key
            def helper(x, y):
                if x + y > y + x:
                    return -1
                elif x + y < y + x:
                    return 1
                else:
                    return 0
    
            return "".join(sorted(map(str, nums), key=cmp_to_key(helper))).lstrip("0") or "0"
    

    执行语句 largestNumber([3,30,34,5,9])

    输出:'9534330'

    第二种,使用类的魔法方法

    def largestNumber( nums) -> str:
        class large_num(str):
            def __lt__(self, other):
                return self + other > other + self
        return "".join(sorted(map(str, nums), key=large_num)).lstrip("0") or "0"
    

    得到结果也是正确的!接下来看看

    多字段排序

    给你数组a = [[2,3],[4,1],(2,8),(2,1),(3,4)],按照第一个数从小到大排序,如果第一个数相同,就按第二个数从大到小。

    a = [[2,3],[4,1],(2,8),(2,1),(3,4)]
    sorted(a, key = lambda x: (x[0], -x[1])) # 输出:[(2, 8), [2, 3], (2, 1), (3, 4), [4, 1]]
    

    其实掌握自定义规则排序,多字段排序也就会了,因为它是自定义排序的子集!

    如果大家对python排序还有更深理解,欢迎留言,一起讨论!

    参考资料:

    【1】:https://docs.python.org/3/howto/sorting.html

    【2】:https://blog.csdn.net/hanshileiai/article/details/44241385

  • 相关阅读:
    poj 1088 滑雪
    位运算与bitset
    hdu 4607 Park Visit
    树的直径
    codeforces 495D Sonya and Matrix
    German Collegiate Programming Contest 2015(第三场)
    BAPC 2014 Preliminary(第一场)
    Benelux Algorithm Programming Contest 2014 Final(第二场)
    E. Reachability from the Capital(tarjan+dfs)
    poj2104 K-th Number(划分树)
  • 原文地址:https://www.cnblogs.com/powercai/p/11354860.html
Copyright © 2011-2022 走看看