【问题标题】:Sorting Python list based on the length of the string根据字符串的长度对 Python 列表进行排序
【发布时间】:2011-02-04 22:55:58
【问题描述】:

我想根据字符串长度对字符串列表进行排序。我尝试按如下方式使用排序,但它似乎没有给我正确的结果。

xs = ['dddd','a','bb','ccc']
print xs
xs.sort(lambda x,y: len(x) < len(y))
print xs

['dddd', 'a', 'bb', 'ccc']
['dddd', 'a', 'bb', 'ccc']

可能出了什么问题?

【问题讨论】:

    标签: python list sorting


    【解决方案1】:

    当您将lambda 传递给sort 时,您需要返回一个整数,而不是布尔值。因此,您的代码应改为如下所示:

    xs.sort(lambda x,y: cmp(len(x), len(y)))
    

    注意cmp 是一个内置函数,如果x 小于ycmp(x, y) 返回-1,如果x 等于y,则返回0,如果x 是,则返回1大于y

    当然,您也可以改用key 参数:

    xs.sort(key=lambda s: len(s))
    

    这告诉sort 方法根据键函数返回的任何内容进行排序。

    编辑:感谢下面的 balpha 和 Ruslan 指出您可以直接将 len 作为关键参数传递给函数,从而消除了对 lambda 的需要:

    xs.sort(key=len)
    

    正如 Ruslan 在下面指出的那样,您还可以使用内置的 sorted 函数而不是 list.sort 方法,它会创建一个新列表而不是对现有列表进行就地排序:

    print(sorted(xs, key=len))
    

    【讨论】:

    • 不需要lambda;只需使用key = len
    • 这将按升序排序(顶部的单词长度较小),以降序排序(底部的单词长度较小)添加参数reverse=True
    • xs.sort() 抛出“TypeError:sort() 没有位置参数”。相反,它应该是xs.sort(key=lambda x: len(x))
    【解决方案2】:

    与 Eli 的答案相同 - 只是使用更短的形式,因为您可以在此处跳过 lambda 部分。

    创建新列表:

    >>> xs = ['dddd','a','bb','ccc']
    >>> sorted(xs, key=len)
    ['a', 'bb', 'ccc', 'dddd']
    

    就地排序:

    >>> xs.sort(key=len)
    >>> xs
    ['a', 'bb', 'ccc', 'dddd']
    

    【讨论】:

    • 如何按长度反向排序?
    • @user2922935 :您可以执行 xs[::-1] 来反转已排序的列表。在这里查看 Dan Bader 的文章:dbader.org/blog/python-reverse-list
    • xs.sort(key=len, reverse=True)
    【解决方案3】:

    我想添加排序时pythonic键功能的工作原理:

    装饰-排序-不装饰设计模式:

    Python 在排序时对键函数的支持是使用所谓的 装饰排序不装饰设计模式。

    分 3 个步骤进行:

    1. 列表中的每个元素都被临时替换为“装饰”版本,其中包括应用于元素的键函数的结果。

    2. 列表根据键的自然顺序排序。

    3. 装饰元素被原始元素替换。

    在进行比较之前指定要在每个列表元素上调用的函数的关键参数。 docs

    【讨论】:

      【解决方案4】:

      最简单的方法是:

      list.sort(key = lambda x:len(x))

      【讨论】:

        【解决方案5】:

        编写一个函数 lensort 根据长度对字符串列表进行排序。

        def lensort(a):
            n = len(a)
            for i in range(n):
                for j in range(i+1,n):
                    if len(a[i]) > len(a[j]):
                        temp = a[i]
                        a[i] = a[j]
                        a[j] = temp
            return a
        print lensort(["hello","bye","good"])
        

        【讨论】:

          【解决方案6】:

          我可以使用以下两种方法,使用函数

          def lensort(x):
              list1 = []
              for i in x:
                  list1.append([len(i),i])
              return sorted(list1)
          
          lista = ['a', 'bb', 'ccc', 'dddd']
          a=lensort(lista)
          print([l[1] for l in a])
          

          在一个使用 Lambda 的 Liner 中,如下所示,上面已经回答了一个。

           lista = ['a', 'bb', 'ccc', 'dddd']
           lista.sort(key = lambda x:len(x))
           print(lista)
          

          【讨论】:

            【解决方案7】:
            def lensort(list_1):
                list_2=[];list_3=[]
            for i in list_1:
                list_2.append([i,len(i)])
            list_2.sort(key = lambda x : x[1])
            for i in list_2:
                list_3.append(i[0])
            return list_3
            

            这对我有用!

            【讨论】:

              猜你喜欢
              • 2018-02-23
              • 2013-11-05
              • 1970-01-01
              • 2020-01-23
              • 1970-01-01
              • 2020-06-28
              • 1970-01-01
              • 2014-02-13
              相关资源
              最近更新 更多