代码之家  ›  专栏  ›  技术社区  ›  palanisr

下面这行python代码对输入数组做了什么?

  •  -5
  • palanisr  · 技术社区  · 11 月前

    鉴于

    C=[4,3,2,5,6,6,8,7]
    

    处理后数组会发生什么变化?

    ind = range(len(C))
    ind.sort(cmp = lambda i, j: C[j] - C[i])
    

    结果

    [6, 7, 4, 5, 3, 0, 1, 2]
    
    1 回复  |  直到 11 月前
        1
  •  2
  •   user2357112    11 月前

    这看起来像是一种过时的编写降序args ort的方法——一种用于生成索引的例程 [C[i] for i in ind] == sorted(C, reverse=True) 它依赖于 cmp 论点 list.sort ,在Python 3中被删除了,因为它对大多数用例来说都是混乱和低效的。

    给定一个列表 ind ,初始化为 range(len(C)) (在Python 2上,其中 range 制作列表),此代码将对以下元素进行排序 ind 基于对应元素值的降序 C . ( C 不会受到影响)

    在Python 3上,这可以写成

    C = [4, 3, 2, 5, 6, 6, 8, 7]
    ind = list(range(len(C)))    # Python 3 needs an explicit conversion to list here
    ind.sort(key=lambda i: -C[i])
    

    C = [4, 3, 2, 5, 6, 6, 8, 7]
    ind = list(range(len(C)))    # Python 3 needs an explicit conversion to list here
    ind.sort(key=lambda i: C[i], reverse=True)
    

    C = [4, 3, 2, 5, 6, 6, 8, 7]
    # No explicit list call needed for this one
    ind = sorted(range(len(C)), key=lambda i: C[i], reverse=True)
    

    Python 2风格比较器接受2个参数并返回一个整数。返回值应小于、等于或大于0,以分别表示第一个参数应小于、大于或等于第二个参数。

    lambda i, j: C[j] - C[i] 将其论点视为 C ,如果第二个参数对应于以下元素,则减法返回负值、0或正值 C 小于、等于或大于第一个参数对应的元素。因此, i 被认为小于 j 根据该比较器,如果 C[i] 更大的 C[j] .

    可以说,将比较器写为 lambda i, j: cmp(C[j], C[i]) ,显式返回比较结果 C[j] C[i] ,而不是减法。这样做不太容易造成混淆。但是考虑到Python 2有多老,希望你实际上不必维护任何Python 2代码。为了使此代码现代化,您需要切换到 key 功能无论如何。