【问题标题】:Python sort() first element of listPython sort() 列表的第一个元素
【发布时间】:2014-01-30 20:13:34
【问题描述】:

我有一个包含非特定数量元素的列表,但嵌套列表的每个第一个元素都是一个标识符,我想使用该标识符对列表进行排序

list = [['D', 'F', 'E', 'D', 'F', 'D'],['A', 'F', 'E', 'C', 'F', 'E'],['C', 'E', 'E', 'F', 'E', 'E'],['B', 'F', 'E', 'D', 'F', 'F']]

排序后

list = [['A', 'F', 'E', 'C', 'F', 'E'],['B', 'F', 'E', 'D', 'F', 'F'],['C', 'E', 'E', 'F', 'E', 'E'],['D', 'F', 'E', 'D', 'F', 'D']]

我正在使用 python 3.3.3

【问题讨论】:

  • 您想根据列表中的第一个元素对列表进行排序吗?您是否尝试对列表 sort() 方法使用键函数?
  • 我有一个包含非特定数量元素的列表,但嵌套列表的每个第一个元素都是一个标识符,我想使用该标识符对列表进行排序
  • 正如我在回复中指出的,不要覆盖内置构造函数liststackoverflow.com/questions/21068315/…

标签: python list sorting python-3.3


【解决方案1】:

Python 自动按第一个元素对列表进行排序。例如:

lol=[[1,2,3],[5,6,7],[0,9,9]]
sorted(lol)
[[0, 9, 9], [1, 2, 3], [5, 6, 7]]

【讨论】:

    【解决方案2】:

    您想使用.sort()sorted

    >>> t = [['D', 'F', 'E', 'D', 'F', 'D'], ['A', 'F', 'E', 'C', 'F', 'E'], ['C', 'E', 'E', 'F', 'E', 'E'], ['B', 'F', 'E', 'D', 'F', 'F']]
    >>> t.sort(key=lambda x: x[0])  # changes the list in-place (and returns None)
    >>> t
    [['A', 'F', 'E', 'C', 'F', 'E'], ['B', 'F', 'E', 'D', 'F', 'F'], ['C', 'E', 'E', 'F', 'E', 'E'], ['D', 'F', 'E', 'D', 'F', 'D']]
    

    另请注意,您的列表需要在其元素之间使用逗号。这是sorted 的结果:

    >>> sorted(t)  # does not change the list but returns the sorted list
    [['A', 'F', 'E', 'C', 'F', 'E'], ['B', 'F', 'E', 'D', 'F', 'F'], ['C', 'E', 'E', 'F', 'E', 'E'], ['D', 'F', 'E', 'D', 'F', 'D']]
    

    如您所见,后一个示例在没有任何关键参数的情况下对列表进行排序。前一个例子也可以;但是您提到只有第一个元素是唯一标识符,因此无法判断对第一个元素之外的列表进行排序的次要标准是什么。

    【讨论】:

      【解决方案3】:

      与其他基本相同,但使用 operator.itemgetter(),

      from operator import itemgetter
      first_item = itemgetter(0)
      new_list = sorted(original_list, key = first_item)
      

      【讨论】:

        【解决方案4】:

        lists.sort(key = lambda x: x[0]) 确保在较大列表中的每个列表之间放置逗号。

        【讨论】:

          【解决方案5】:

          您不应该覆盖内置列表构造函数list,而是使用另一个名称,如下所示:

          >>> a_list = [['D', 'F', 'E', 'D', 'F', 'D'],['A', 'F', 'E', 'C', 'F', 'E'],['C', 'E', 'E', 'F', 'E', 'E'],['B', 'F', 'E', 'D', 'F', 'F']]
          

          要对列表进行就地排序,请使用list.sort 方法:

          >>> a_list.sort()
          
          >>> a_list
          [['A', 'F', 'E', 'C', 'F', 'E'], ['B', 'F', 'E', 'D', 'F', 'F'], ['C', 'E', 'E', 'F', 'E', 'E'], ['D', 'F', 'E', 'D', 'F', 'D']]
          

          内置函数sorted 返回一个新列表,这是您似乎不想做的事情。它返回一个新列表,如果您不再需要旧列表,则会浪费内存空间。

          Python 自动对第一个元素进行排序。然后它会自动按第二个、第三个等排序。按照其他人的建议使用 lambda 意味着您只会对第一个元素进行排序,而后面的元素将被忽略。

          >>> a_list = [['b', 'f'],['b', 'e'],['b', 'd'],['a', 'c'],['a', 'b'],['a', 'a'],]
          >>> a_list.sort(lambda x,y : cmp(x[0], y[0]))
          >>> a_list
          [['a', 'c'], ['a', 'b'], ['a', 'a'], ['b', 'f'], ['b', 'e'], ['b', 'd']]
          

          这就是为什么排序被描述为稳定排序

          >>> help(list.sort)
          Help on method_descriptor:
          
          sort(...)
              L.sort(cmp=None, key=None, reverse=False) -- stable sort *IN PLACE*;
              cmp(x, y) -> -1, 0, 1
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2013-09-25
            • 2020-07-31
            • 2014-11-06
            • 2013-10-29
            • 2021-11-09
            • 2017-08-18
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多