【问题标题】:Sort a multidimensional list by a variable number of keys按可变数量的键对多维列表进行排序
【发布时间】:2009-11-05 21:30:45
【问题描述】:

我已阅读 this post 并没有最终为我工作。

编辑:我所描述的功能就像 Excel 中的排序功能......如果这样更清楚的话

这是我的情况,我有一个制表符分隔的文本文档。大约有 125,000 行,每行 6 列(列由制表符分隔)。我已将文档拆分为二维列表。

我正在尝试编写一个通用函数来对二维列表进行排序。基本上我想要一个函数,我可以传递大列表,以及我想对大列表进行排序的一个或多个列的键。显然,我希望传递的第一个键是主排序点,然后是第二个键,等等。

还是一头雾水?

这是我想做的一个例子。

Joel    18  Orange  1
Anna    17  Blue    2
Ryan    18  Green   3
Luke    16  Blue    1
Katy    13  Pink    5
Tyler   22  Blue    6
Bob     22  Blue    10
Garrett 24  Red 7
Ryan    18  Green   8
Leland  18  Yellow  9

假设我将此列表传递给我的魔法函数,如下所示:

sortByColumn(bigList, 0)

Anna    17  Blue    2
Bob     22  Blue    10
Garrett 24  Red 7
Joel    18  Orange  1
Katy    13  Pink    5
Leland  18  Yellow  9
Luke    16  Blue    1
Ryan    18  Green   3
Ryan    18  Green   8
Tyler   22  Blue    6

还有……

sortByColumn(bigList, 2, 3)

Luke    16  Blue    1
Anna    17  Blue    2
Tyler   22  Blue    6
Bob     22  Blue    10
Ryan    18  Green   3
Ryan    18  Green   8
Joel    18  Orange  1
Katy    13  Pink    5
Garrett 24  Red 7
Leland  18  Yellow  9

有什么线索吗?

【问题讨论】:

    标签: python sorting


    【解决方案1】:
    import operator:
    def sortByColumn(bigList, *args)
        bigList.sort(key=operator.itemgetter(*args)) # sorts the list in place
    

    【讨论】:

    • 太棒了。我从未听说过 itemgetter(或 attrgetter,我现在也看到了)。
    • 这正是我正在寻找的。非常感谢!
    【解决方案2】:

    这将按第 2 列和第 3 列排序:

    a.sort(key=operator.itemgetter(2,3))
    

    【讨论】:

      【解决方案3】:

      这里的关键思想(双关语)是使用一个返回元组的键函数。 下面,关键函数是lambda x: (x[idx] for idx in args) x 设置为等于 aList 的一个元素——即一行数据。它返回一组值,而不仅仅是一个值。 sort() 方法根据列表的第一个元素进行排序,然后与第二个元素断开连接,依此类推。见http://wiki.python.org/moin/HowTo/Sorting#Sortingbykeys

      #!/usr/bin/env python
      import csv
      def sortByColumn(aList,*args):
          aList.sort(key=lambda x: (x[idx] for idx in args))
          return aList
      
      filename='file.txt'
      def convert_ints(astr):
          try:
              return int(astr)
          except ValueError:
              return astr    
      biglist=[[convert_ints(elt) for elt in line]
               for line in csv.reader(open(filename,'r'),delimiter='\t')]
      
      for row in sortByColumn(biglist,0):
          print row
      
      for row in sortByColumn(biglist,2,3):
          print row
      

      【讨论】:

      • 数字必须转换为整数
      【解决方案4】:

      确保您已将数字转换为整数,否则它们将按字母而不是数字排序

      # Sort the list in place
      def sortByColumn(A,*args):
          import operator
          A.sort(key=operator.itemgetter(*args))
          return A
      

      # Leave the original list alone and return a new sorted one
      def sortByColumn(A,*args):
          import opertator
          return sorted(A,key=operator.itemgetter(*args))
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-03-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-06-28
        相关资源
        最近更新 更多