通过可变数量的键对多维列表进行排序

时间:2009-11-05 21:30:46

标签: python sorting

我读过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

任何线索?

4 个答案:

答案 0 :(得分:11)

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

答案 1 :(得分:8)

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

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

答案 2 :(得分:2)

这里的关键思想(双关语)是使用返回元组的键函数。 下面,关键功能是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

答案 3 :(得分:1)

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

# 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))